我在这里阅读了这篇SO文章,给出的解决方案是R
代码块:
f <- function(x, T) {
10 * sin(0.3 * x) * sin(1.3 * x^2) + 0.001 * x^3 + 0.2 * x + 80
}
g <- function(x, T, f. = f) { ## 1. note f.
exp(-f.(x)/T)
}
test<- function(g. = g, T = 1) { ## 2. note g.
g.(1,T)
}
test()
## [1] 8.560335e-37
我只想对g
和test
的函数定义中的语法做一点解释,作者注意到f.
和g.
。我在使用map
或类似的东西时看到过.f
和.g
之类的东西,但我还没有看到.
。我试过在谷歌上搜索,但我无法确定它到底是什么,结果很糟糕。我相信这与递归有关?我真的不知道。
末尾的点对语法没有影响,它就像标识符中的任何其他合法字符一样。开头的点影响很小,但这意味着默认情况下ls()
不会显示变量。
在您发布的示例中,作者可能使用f.
来提醒读者默认值为f
,而g.
则提醒读者g
。
部分参数匹配意味着用户可以编写test(g = somefn)
,R将把somefn
视为g.
参数的值。
在你看到这段代码的参考问题中,原始函数有标题
g <- function(x, T, f=f) {
这是行不通的,因为默认值与参数同名,并且默认值是在函数的框架中计算的。所以上面写着";如果未指定参数f
,请将其设置为参数f
"这毫无意义。你发布的更正版本说";如果未指定参数f.
,请将其设置为全局变量f
">