【发布时间】:2016-10-29 21:16:28
【问题描述】:
这个问题有两个方面。首先,我试图找出在向量上实现函数的简单实现的最佳方法。其次,我试图理解 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
(广义)向量; FUN 返回值的模板。请参阅“详细信息”。
详细说明:
vapply 返回与 FUN.VALUE 匹配的向量或数组。如果 length(FUN.VALUE) == 1 则返回与 X 长度相同的向量,否则返回数组。如果 FUN.VALUE 不是一个数组,则结果是一个包含 length(FUN.VALUE) 行和 length(X) 列的矩阵,否则为一个数组 a,dim(a) == c(dim(FUN.VALUE), length (X))。
这对我来说毫无意义。在我的例子中,A 是一个包含 20 个元素的向量,显然我希望输出是一个包含 20 个元素的向量。那么如何指定一个广义的 20 元素向量模板呢?这样一个模板的长度不会是 20,而不是 1?
我真的很感谢这里的一些帮助。我发现文档非常令人沮丧,很难说是因为我遗漏了一些明显的东西,还是因为文档含糊不清。
【问题讨论】:
-
FUN.VALUE只是指定返回值类型。通常这不是必需的,但它可以捕获某些类型的错误。你传入一个正确类型的对象,比如character() -
如果我没有为 FUN.VALUE 指定任何内容,我会收到一个错误:vapply(X, Fun) 中的错误:缺少参数“FUN.VALUE”,没有默认值
-
如果您不想指定
FUN.VALUE,请改用sapply。 -
感谢@MatthewLundberg,通过使用以下函数,我能够让它与 sapply 一起使用:Fun = function(x) {if (x