【问题标题】:passing an anonymous function as argument将匿名函数作为参数传递
【发布时间】:2015-11-19 16:55:44
【问题描述】:

为什么以下工作:

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

这不是:

curve(function(x) {x})

曲线错误(函数(x){: “expr”未计算为长度为“n”的对象

还有

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


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

我尝试了“quote()”和“expression()”的各种组合,但没有结果。

【问题讨论】:

  • 来自?curve : expr : 函数的名称,或者调用或写成 x 的函数的表达式。所以curve({x}) 例如工作。您只需删除function(x)。你也可以去掉括号。
  • 哦,我已经阅读了帮助,但它让我尝试了 curve(x)curve(quote(x)) 都失败了......
  • 鉴于x 本身不是一个函数,您需要括号,但您可以使用curve(sin(x))curve({sin(x)})(澄清我关于删除括号的评论)
  • 感谢您提供有效的解决方案。不过,我的问题更多的是关于 为什么 它不起作用,当两个参数显然相等时。
  • 我会写一个答案

标签: r


【解决方案1】:

实际上curve 的帮助页面没有说'expr' 参数可以是一个函数对象。三种接受的参数类型是“函数的名称,或者作为 x 的函数编写的调用或表达式,它将评估为与 x 长度相同的对象”。 (强调了。)

以下全部成功:

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-函数解析对象或对象名称并比较字符结果。)

【讨论】:

    【解决方案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,这不是我们想要的。

    【讨论】:

      猜你喜欢
      • 2019-11-23
      • 2011-05-11
      • 1970-01-01
      • 2012-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多