下面是一个将参数传递给返回函数的人为例子。我想让返回的函数将param评估为2,事实上,这就是它的作用!!
然而,这是如何工作的?当我打印该功能时,它会显示" param"而不是" 2"。但是当我debug()
时,我确认参数实际上是2。
f <- function(x, param = 2) {
my_cdf <- ecdf(x)
function(new_x) {
my_cdf(new_x) * param
}
}
g <- f(1:10)
g
# > function(new_x) {
# > my_cdf(new_x) * param
# > }
答案 0 :(得分:1)
由于param
未在使用它的函数中定义,因此在环境中查找param
,而使用它的函数是已定义和param在那个环境中= 2。这被称为词汇范围。
如果您希望param
实际替换为该功能,请尝试substitute
,如下所示:
f <- function(x, param = 2) {
my_cdf <- ecdf(x)
F <- function(new, x)
my_cdf(new_x) * param
body(F) <- do.call("substitute", list(body(F), list(param = param)))
F
}
f(1:10)
答案 1 :(得分:0)
来自Advanced R的chapter更详细地介绍了正在发生的事情。
该章的一些例子:
as.list(environment(g))
# $my_cdf
# Empirical CDF
# Call: ecdf(x)
# x[1:10] = 1, 2, 3, ..., 9, 10
#
# $x
# [1] 1 2 3 4 5 6 7 8 9 10
#
# $param
# [1] 2
library(pryr)
unenclose(g)
# function (new_x)
# {
# (function (v)
# .approxfun(x, y, v, method, yleft, yright, f))(new_x) * 2
# }