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

时间:2017-07-13 16:08:46

标签: r

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

2 个答案:

答案 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
# }