我正在尝试创建一个从Wickham's example on closures开始的函数组成的简约示例
这有效:
power <- function(exponent, base_f) {
base_f <- function(x) {
x ^ exponent
}
base_f
}
square <- power(exponent = 3)
square(x = 2)
但这不是:
base_f <- function(x) {
x ^ exponent
}
power <- function(exponent, base_f) {
res1 <- base_f(x)
return(res1)
}
square <- power(exponent = 3)
square(x = 2)
为什么?
我正在寻找一种将两个功能分开的解决方案。
答案 0 :(得分:0)
第二个示例中存在三个问题。
首先,power
指的是x
,但未定义。您想要res <- base_f
,
不是res <- base_f(x)
第二,请注意R使用词法作用域。这意味着,当在函数中引用变量并且该变量先前也未在该函数中定义时,它将查找该函数的词法环境,即查找定义的环境。 -不是调用该函数的环境。
在第二个示例中,base_f
将不会查看power
的{{1}},而是会查看全局环境,因为这是定义exponent
的词法环境。复制base_f
,并将其环境设置为base_f
中的当前环境。
第三,在代码末尾调用power
时,缺少第二个参数。
进行这些更改即可。我们已经用##标记了更改的行或新的行。
power