【问题标题】:Applying a simple function over a vector using vapply使用 vapply 在向量上应用一个简单的函数
【发布时间】: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

标签: r function vector


【解决方案1】:

您的函数存在错误。而不是

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

你真的想要:

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

目前,您的函数没有返回任何内容。它修改了x,但不返回它,所以它只是随着函数而死。在A 上执行correct_fun 我得到:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 2015-09-07
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    相关资源
    最近更新 更多