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(*,simplify = FALSE,USE.NAMES = FALSE)相当于lapply(*)。
但是,我得到与以上相同的结果:
lapply(lst, "[", i=1, j=)
sapply(lst, "[", i=1, j=, simplify=FALSE, USE.NAMES=FALSE)
顺便说一下,我知道在这种情况下只添加TRUE
就能解决问题,但我更感兴趣的是为什么会有差异,而不是如何解决它。我实际上更感到惊讶的是它适用于lapply
案例,而不适用于sapply
案例。
答案 0 :(得分:1)
因为我根本不是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}}并且因为它无法确定在1,
或j=
之前如何处理simplify=FALSE, USE.NAMES=FALSE
或lapply
SEXP args
,它失败了。虽然那只是我的猜测。鉴于1,
没有将其他参数强加到j=
,因此它可以以不同的方式处理{{1}}或{{1}}。
这篇文章Understanding how .Internal C functions are handled in R做了很好的工作,解释了一些非常严谨的C语言。
希望这有助于在一定程度上解释这些差异,或者至少可以作为具有更高R-devel技能的人的起点。