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 高手,所以我只能给你展示 sapply
和 lapply
在内部如何表示的区别。也许其他人可以在这个答案的基础上做一点。
所以对于 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
之后的所有内容创建 sapply
的 sapply(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/