使用vapply

时间:2016-06-27 18:43:38

标签: r function vector

这个问题有点双重。首先,我试图找出在向量上实现函数的简单实现的最佳方法。其次,我试图在vapply中理解FUN.VALUE的含义。

我已经定义了一个简单的半波整流功能:

Fun = function(x) x[x<0]=0

然后我定义了一个向量:

A = -10:10

我希望将此函数应用于向量。我尝试了很多方法,但无法轻易弄清楚如何做到这一点。

我总能做到

A[A<0]=0

但这违背了使用函数的目的。

我尝试定义函数,使其适用于向量的每个元素,而不是整个向量:

Fun = function(x) {if (x<0) {x=0} }

我无法使用apply,因为只有在你应用函数的对象具有维度时,apply才会起作用,并且由于某种原因,向量在R中没有维度。

如果我使用lapply,我会得到NULL,或输出对象的每个元素为0,具体取决于我使用的上述两个函数中的哪一个。

对于vapply,我对FUN.VALUE的文档没有任何意义

这就是它所说的:

  

FUN.VALUE
  a(广义)向量;来自FUN的返回值的模板。请参阅“详细信息”。

并在细节中:

  

vapply返回与FUN.VALUE匹配的向量或数组。如果length(FUN.VALUE)== 1,则返回与X长度相同的向量,否则返回一个数组。如果FUN.VALUE不是数组,则结果是具有长度(FUN.VALUE)行和长度(X)列的矩阵,否则是具有dim(a)== c(dim(FUN.VALUE),长度的数组a (X))。

这对我没有意义。在我的例子中,A是一个包含20个元素的向量,显然我希望输出为20个元素向量。那么如何指定一个通用的20元素向量模板呢?并且这个模板的长度不是20,而不是1?

我非常感谢这里的一些帮助。我发现文档令人难以置信地令人沮丧,而且很难判断它是否因为我错过了一些明显的东西,或者文档是否含糊不清。

1 个答案:

答案 0 :(得分:4)

你的功能有一个错误。而不是

Fun = function(x) x[x<0]=0

你真的想要:

correct_fun = function(x){
  x[x<0]=0
  return(x)
}

原样,你的功能目前还没有返回任何内容。它会修改x但不会返回它,因此它会随函数而死。在correct_fun执行A我得到:

[1]  0  0  0  0  0  0  0  0  0  0  0  1  2  3  4  5  6  7  8  9 10