使用 vapply 而不是 sapply
Using vapply instead of sapply
我正在阅读 http://adv-r.had.co.nz/Functionals.html 上 Hadley 的 Advanced R。他谈到了 sapply
和 vapply
之间的区别。我的问题是关于使用 vapply
而不是 sapply
,他在他的例子中没有进一步讨论。
这是他的代码:
df2 <- data.frame(x = 1:10, y = Sys.time() + 1:10)
sapply(df2, class)
这个returns
$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。我会很感激你的想法。
问题 1:
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()
.
我正在阅读 http://adv-r.had.co.nz/Functionals.html 上 Hadley 的 Advanced R。他谈到了 sapply
和 vapply
之间的区别。我的问题是关于使用 vapply
而不是 sapply
,他在他的例子中没有进一步讨论。
这是他的代码:
df2 <- data.frame(x = 1:10, y = Sys.time() + 1:10)
sapply(df2, class)
这个returns
$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。我会很感激你的想法。
问题 1:
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()
.