【发布时间】:2023-04-01 10:34:01
【问题描述】:
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 帮助中指出
sapply(*, simple = FALSE, USE.NAMES = FALSE) 等价于 lapply(*)。
但是,对于以下内容,我得到与上述相同的结果:
lapply(lst, "[", i=1, j=)
sapply(lst, "[", i=1, j=, simplify=FALSE, USE.NAMES=FALSE)
顺便说一句,我知道在这种情况下,只需添加TRUE 就可以解决问题,但我更感兴趣的是为什么会有差异,而不是如何解决它。实际上,我更惊讶它适用于lapply 的情况,而不是不适用于sapply 的情况。
【问题讨论】:
-
我猜它不是特定于
sapply而是特定于任何lapply包装器:(function(X, FUN, ...) lapply(X, FUN, ...))(lst, "[", 1, );也许,它与?lapply中的“历史原因”注释有关,而它的包装器必须评估他们的论点? -
你看过 sapply 和 lapply 的源代码吗?
-
@JamesTobin:我查看了源代码的 R 部分。
sapply真的只是调用lapply(此时它失败了)然后简化了结果。lapply调用.Internal(lapply(X, FUN)),我还没有看过它的源代码。lapply似乎也根本没有使用...(?)但似乎在sapply调用和lapply调用之间以某种方式...的含义发生了变化。