This answer 提出了 R 中的省略号功能如何处理空参数的问题。显然 ... 中的空参数有时有效(请参阅下面的 lapply 版本),但其他时候无效(请参阅 sapply 版本)。这是示例:

lst <- list(x=matrix(1))
lapply(lst, "[", 1, )
# $x
# [1] 1
sapply(lst, "[", 1, )
# Error in lapply(X = X, FUN = FUN, ...) :
#   argument is missing, with no default

据我所知, sapply 实际上只是在调用 ... 时重用了它的 lapply 参数。所以我不明白为什么 lapply 有效但 sapply 没有。任何人都可以解释这种行为。

sapply 帮助中,它指出



但是,对于以下内容,我得到了与上述相同的结果:
lapply(lst, "[", i=1, j=)
sapply(lst, "[", i=1, j=, simplify=FALSE, USE.NAMES=FALSE)

顺便说一句,我知道在这种情况下只添加 TRUE 就可以解决问题,但我更感兴趣的是为什么会有差异,而不是如何解决它。我实际上更惊讶的是它适用于 lapply 案例而不是它不适用于 sapply 案例。

最佳答案

因为我根本不是 C 高手,所以我只能给你展示 sapplylapply 在内部如何表示的区别。也许其他人可以在这个答案的基础上做一点。

所以对于 sapply :我们将看看 https://github.com/SurajGupta/r-source/blob/master/src/library/base/R/sapply.R

对于 lapply:https://github.com/SurajGupta/r-source/blob/master/src/library/base/R/lapply.R

这表明虽然 sapply 调用 lapply 它然后也调用 simplify2array 这可能是问题之一,但我的直觉告诉我这不是问题。
lapply 最终使用 .Internal(lapply(X,FUN)),它最终在 C 源代码中调用 do_lapply:https://github.com/SurajGupta/r-source/blob/91aaa43312da6b0e6906ef221fd7756dc0459843/src/main/apply.c

我的猜测是,因为 sapply 固有地将两个参数传递给 SEXP args,因此 ... 参数试图用 SEXP args 之后的所有内容创建 sapplysapply(lst, "[",,并且因为它无法在到达之前弄清楚如何处理 1,j=simplify=FALSE, USE.NAMES=FALSE ,它失败了。虽然这只是我的猜测。而 lapply 没有将附加参数强制到 SEXP args 中,因此它可以以不同的方式处理 1,j=

这篇文章 Understanding how .Internal C functions are handled in R 很好地解释了一些 C 语言的细节。

希望这有助于在某种程度上解释差异,或者至少可以作为具有更高 R 开发技能的人的起点。

关于r - 传递空省略号参数时的不同行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25179109/

10-13 03:07