这个问题有点双重。首先,我试图找出在向量上实现函数的简单实现的最佳方法。其次,我试图在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?
我非常感谢这里的一些帮助。我发现文档令人难以置信地令人沮丧,而且很难判断它是否因为我错过了一些明显的东西,或者文档是否含糊不清。
答案 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