R 返回带有传递参数的函数时,如何存储参数?
下面是一个将参数传递给返回函数的人为示例。我想让返回的函数将param计算为2,事实上,它就是这样做的 然而,这是如何工作的?当我打印函数时,它显示param而不是2。但当我调试时,我确认param实际上是2R 返回带有传递参数的函数时,如何存储参数?,r,R,下面是一个将参数传递给返回函数的人为示例。我想让返回的函数将param计算为2,事实上,它就是这样做的 然而,这是如何工作的?当我打印函数时,它显示param而不是2。但当我调试时,我确认param实际上是2 f <- function(x, param = 2) { my_cdf <- ecdf(x) function(new_x) { my_cdf(new_x) * param } } g <- f(1:10) g # &
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
# > }
由于param未在使用它的函数中定义,因此将在wihch中的环境中查找param。使用它的函数已定义,并且在该环境中param=2。这被称为词汇范围界定
如果要将param实际替换到函数中,请尝试如下替换:
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)
来自Advanced R的这篇文章更详细地介绍了正在发生的事情
该章中的几个例子:
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
# }
我通过显示返回的函数对我的问题进行了更正,但您的答案仍然适用。我最初尝试获取要评估的$param$,以便在检查$g$时,它将显示2。既然一切都正常,现在就更没有意义了。在中添加了一个实际替换param的示例。