为什么以下工作:
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;没有结果。
答案 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,这不是我们想要的。