【问题标题】:I've vectorized a custom function, why is outer giving me an error?我已经矢量化了一个自定义函数,为什么外部给我一个错误?
【发布时间】:2020-05-12 00:07:25
【问题描述】:

  cubeAndAdd<-function(x,y){x^3+y^3}
  outer(-1:1,-1:1,function(x,y) Vectorize(cubeAndAdd(x,y)))

运行此程序后,您将收到警告消息:

Warning message:
In formals(fun) : argument is not a function

这是为什么?毕竟,如果我真的不使用函数,那么这段代码根本不会运行。

【问题讨论】:

  • 或许可以:outer(-1:1,-1:1,Vectorize(cubeAndAdd))?既然你已经定义了 x 和 y,还需要重新定义一个 lambda 吗?
  • @NelsonGon 这行得通,而且肯定比我所拥有的要好,但它并不能解释错误。
  • 错误是再次定义function(x,y),它引入了另一个lambda,因此不清楚与函数匹配的内容。如果你真的想明确,那么:outer(-1:1,-1:1,Vectorize(function(x,y) cubeAndAdd(x,y)))

标签: r vectorization


【解决方案1】:

问题出在您向Vectorize 提供的内容上。

Vectorize 想要一个函数作为它的参数。 cubeAndAdd 是一个函数,但 cubeAndAdd(x,y) 是一个函数调用

要使您的 outer 循环在语法上正确,您应该使用 Vectorize 创建向量化函数,然后调用该新函数:

outer(-1:1,-1:1,function(x,y) Vectorize(cubeAndAdd)(x,y))

这里,Vectorize(cubeAndAdd) 是函数,您使用 (x,y) 作为参数调用它:所以 Vectorize(cubeAndAdd)(x,y)

(尽管从outer 循环中删除整个匿名function(x,y) 的建议在这里有效(并使单行更短),但将参数显式“提供”给函数通常是个好主意,正如您所做的那样,因为这允许人们使用需要额外参数的函数)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-25
    • 2019-12-09
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    相关资源
    最近更新 更多