传递空省略号参数时的不同行为

时间:2014-08-07 09:37:59

标签: r lapply

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案例。

1 个答案:

答案 0 :(得分:1)

因为我根本不是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_lapplyhttps://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=FALSElapply SEXP args,它失败了。虽然那只是我的猜测。鉴于1,没有将其他参数强加到j=,因此它可以以不同的方式处理{{1}}或{{1}}。

这篇文章Understanding how .Internal C functions are handled in R做了很好的工作,解释了一些非常严谨的C语言。

希望这有助于在一定程度上解释这些差异,或者至少可以作为具有更高R-devel技能的人的起点。