R 返回带有传递参数的函数时,如何存储参数?

R 返回带有传递参数的函数时,如何存储参数?,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 # &

下面是一个将参数传递给返回函数的人为示例。我想让返回的函数将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

# > 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的示例。