传递匿名函数作为参数

时间:2015-11-19 16:55:44

标签: r

为什么以下工作:

foo <- function(x) {x}
curve(foo)
# plots the identity function between 0 and 1

这不是:

curve(function(x) {x})
  

曲线错误(function(x){:     &#39; EXPR&#39;没有评估长度的对象&#39;

然而

# the anonymous function can be called 
foo(1) #1
(function(x) x)(1) #1


all.equal(foo, function(x) {x})
# TRUE

我尝试了各种组合&#34; quote()&#34;和&#34;表达式()&#34;没有结果。

2 个答案:

答案 0 :(得分:4)

实际上curve的帮助页面表示&#39; expr&#39;参数可以是函数对象。接受的三种类型的参数是函数的&#34; name ,或者作为x函数编写的调用或表达式,它将计算为与x相同长度的对象。&# 34; (重点补充。)

以下所有成功:

curve( (function(x) {x})(x) )
curve( local(x)  )
curve( eval(x)  )

当你看到......

all.equal(foo, function(x) {x})
# TRUE

...它是说附加到名称foo的语言对象与function(x) {x}相同。 (all.equal.language - 函数会删除对象或对象名称并比较字符结果。)

答案 1 :(得分:2)

?curve表示expr(第一个参数)应该是函数的名称,调用或作为x函数编写的表达式,它将计算为与长度相同的对象。 X

因此,curve({x})将产生预期的结果。

至于为什么curve(function(x){x})会返回错误,阅读curve的代码会有所帮助。在函数定义的最后,我们有:

y <- eval(expr, envir = ll, enclos = parent.frame())
    if (length(y) != length(x)) 
        stop("'expr' did not evaluate to an object of length 'n'")

我们有:

eval(function(x){x})
# function(x){x}

x在功能代码中定义为seq.int(0, 1, length.out = 101)

因此,通过调用,我们将错误视为eval,长度为1,这不是我们想要的。