【问题标题】:FUN.VALUE argument in vapplyvapply 中的 FUN.VALUE 参数
【发布时间】:2019-01-10 11:03:13
【问题描述】:

我并没有真正理解 vapply 中的 FUN.VALUE 参数。 这是我的例子:

a = list(list(1,2), list(1), list(1,2,3))

# give the lengths of each list in a
sapply(a, length)

现在,我尝试使用 vapply 而不是 sapply 使其类型安全

# gives me same result as sapply
vapply(a, length, FUN.VALUE=1)

# same result, but why?
vapply(a, length, FUN.VALUE=1000)

# gives me error
vapply(a, length, FUN.VALUE="integer")

# gives me error
vapply(a, length, FUN.VALUE="vector")

# gives me error
vapply(a, length, FUN.VALUE=c(1,2))

?vapply 读到FUN.VALUE 可以是标量、向量或矩阵,用于匹配输出的类型。为什么vapply 会有这种行为的任何提示?

【问题讨论】:

  • 但是,长度给出了一个数字。您可以使用vapply(a, length, FUN.VALUE= numeric(1))vapply(a, length, FUN.VALUE= integer(1)) 但它会给出vapply(a, length, FUN.VALUE= character(1)) 的错误这里括号内的数字表示每个循环的预期输出长度
  • 关于为FUN.VALUE 使用单个数值,我认为它将其解析为数字而不是长度。即您可以传递任何数字vapply(a, length, FUN.VALUE= 0) 以获得相同的输出。但是,如果你将它作为字符串传递,它会感知 character 输出 vapply(a, length, FUN.VALUE= "0") 并给出错误
  • 对于vapply,您需要在括号中定义类型(整数、字符、逻辑)AND 长度,如@akrun 显示的是否强制。但是传递一个数字很有趣,它起作用了。我想知道这是否适用于矩阵/数组返回等其他方法。去实验室!
  • 好吧,我想,git吧,问函数返回的类型和长度;谢谢!

标签: r list apply


【解决方案1】:

来自vapply 文档,

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

注意它说的是“返回值的模板”,而不是“描述返回值的字符串”。查看详细信息部分可提供更多指导:

此函数检查FUN 的所有值是否与FUN.VALUE 兼容,它们必须具有相同的长度和类型。 [强调]

您的示例中的函数length() 返回一个长度为 1 的数字(如果我们想具体说明,是一个整数)。当您使用FUN.VALUE = 1 时,1 的长度和类型与您期望的输出相同,因此检查通过。当你使用FUN.VALUE = "integer"时,"integer"是一个长度为1的字符向量,所以长度检查通过但类型检查失败。

继续:

(在排序逻辑

因此,如果您在 vapply 使用可能返回整数或双精度值的函数,您应该确保指定类似 FUN.VALUE = 1.0

文档继续讨论如何处理数组/矩阵。我不会在这里复制/粘贴它。

【讨论】:

  • 如何将 vapply 应用于包含我在 R 环境中的一堆数据集的数据框名称的字符串。我想使用get函数。在这种情况下,FUN.VALUE 默认是什么?
  • 如果您的函数返回数据帧,“相同长度和类型”将建议list(数据帧是特殊列表),以及结果中列数的长度。如果它们的列数不同,vapply 将不起作用。即便如此,vapply 也可能不会让你得到太多。也许只使用mget
猜你喜欢
  • 2018-05-27
  • 1970-01-01
  • 2017-08-06
  • 2022-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 2020-01-22
相关资源
最近更新 更多