gpt4 book ai didi

r - 使用 vapply 而不是 sapply

转载 作者:行者123 更新时间:2023-12-02 08:14:14 25 4
gpt4 key购买 nike

我正在阅读 Hadley 的 Advanced R,网址为 http://adv-r.had.co.nz/Functionals.html .他谈到了 sapplyvapply 之间的区别。我的问题与使用 vapply 而不是 sapply 有关,他没有在他的示例中进一步讨论。

这是他的代码:

df2 <- data.frame(x = 1:10, y = Sys.time() + 1:10)
sapply(df2, class)

返回

$x
[1] "integer"

$y
[1] "POSIXct" "POSIXt"

但是,当我运行 vapply 时,出现错误。

vapply(df2, class, character(1))

错误:

Error in vapply(df2, class, character(1)) : values must be length 1,
but FUN(X[[2]]) result is length 2

我有两个问题:

问题:1) 当我用字符 (2) 替换字符 (1) 时,出现以下错误消息:

vapply(df2, class, character(2))
Error in vapply(df2, class, character(2)) : values must be length 2,
but FUN(X[[1]]) result is length 1

为什么会这样?

问题:2)如何使用vapply而不是sapply

我正在学习 R,因此您的回答将帮助我更深入地了解 R。我会很感激你的想法。

最佳答案

问题一:

character(2) 的错误是因为字符向量 "integer" 的长度仅为 1,并且正确地未能通过与字符向量预期结果的一致性检查长度为 2.

问题2:

vapply() 作为 safer version of sapply() 在那里因为它确保您只能从 FUN 的每个应用程序中得到您期望的结果。我猜它也更安全,因为 vapply() 的输出是一致的——你不会得到向量、矩阵或列表。您将获得一个长度为 1 的向量返回的子组件,否则将获得一个数组。

在您给出的具体示例中,您不能使用 vapply() 因为 class 返回的内容不一致。您必须知道或期望某些输出,如果调用 FUN 的输出与预期不匹配,则 vapply() 会失败。

在这种情况下,我想你可以做

df2 <- data.frame(x = 1:10, y = Sys.time() + 1:10)
vapply(df2, FUN = function(x) paste(class(x), collapse = "; "),
FUN.VALUE = character(1))

> vapply(df2, FUN = function(x) paste(class(x), collapse = "; "),
+ FUN.VALUE = character(1))
x y
"integer" "POSIXct; POSIXt"

但这对你是否有用是另一回事。

实际上,使用 vapply() 归根结底是知道从 FUN 中可以得到什么,并且只希望获得该输出。如果您不知道或无法控制它,您可能最好使用 lapply()

关于r - 使用 vapply 而不是 sapply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43504174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com