R:sapply/lapply不同的名字行为
我将一些问题简化为以下玩具代码:R:sapply/lapply不同的名字行为,r,R,我将一些问题简化为以下玩具代码: cc<-c("1","2") ff<-function(x) { list(myname=x)} aa<-unlist(lapply(cc,ff)) bb<-sapply(cc,ff) 但是,我知道sapply的USE.NAMES参数- 就像- 使用.logical名称;如果为TRUE且X为字符,则使用X作为 结果,除非它已经有名称 所以在这种情况下应该没有影响 在内部,它甚至没有传递到simp
cc<-c("1","2")
ff<-function(x) { list(myname=x)}
aa<-unlist(lapply(cc,ff))
bb<-sapply(cc,ff)
但是,我知道sapply的USE.NAMES参数-
编辑:进一步调查后发现,造成差异的根本原因是Sappy本质上等同于非Sappy
unlist(lappy(cc,ff)
而是
unlist(lappy(cc,ff),recursive=FALSE)
(这是确切的内部未列出调用)。请仔细查看以下内容:
lapply(cc, ff)
#> [[1]]
#> [[1]]$myname
#> [1] "1"
#>
#>
#> [[2]]
#> [[2]]$myname
#> [1] "2"
lappy
本身的输出没有名称。请看:
a <- lapply(cc, ff)
names(a)
#> NULL
因此,事实上,USE.NAMES
将应用,sapply
将cc
的内容指定为lappy
输出的名称,如文档中所述,sapply
是一个薄型包装器。遵循代码非常简单:
sapply
#> function (X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)
#> {
#> FUN <- match.fun(FUN)
#> answer <- lapply(X = X, FUN = FUN, ...)
#> if (USE.NAMES && is.character(X) && is.null(names(answer)))
#> names(answer) <- X
#> if (!isFALSE(simplify) && length(answer))
#> simplify2array(answer, higher = (simplify == "array"))
#> else answer
#> }
#> <bytecode: 0x036ae7a8>
#> <environment: namespace:base>
sapply
#>函数(X,FUN,…,simplify=TRUE,USE.NAMES=TRUE)
#> {
#>有趣的答案if(使用.NAMES&&is.character(X)和&is.null(NAMES(答案)))
#>如果(!isFALSE(simplify)和长度(answer))则命名(答案)
#>simplify2array(答案,更高=(simplify=“数组”))
#>其他答案
#> }
#>
#>
但是cc
没有名字,所以它们是added@user20650ff添加了名称。我将“除非它有名称”中的it取为X,输入不是结果,但重读时我可能会弄错…(这里发生的事情name(cc)=c(“A”,“B”);sapply(cc,ff)
)谢谢,但请注意,它以某种方式巧妙地连接了预先存在的名称和cc的内容。我不确定这是否是预期的行为。@OfekShilon它是预期的行为。它将名称关联起来,因为一旦它将名称添加到顶级列表中,它将嵌套列表简化为一个层。当它这样做时,它将关联起来测试第一层和第二层的名称。请尝试取消列表(list(a=list(b=1),c=list(d=1))
以了解我的意思啊,谢谢。以及类()中的差异原因?Simpled2Array本质上是对unlist的包装。我接受答案,但请注意我在问题中添加的其他信息。@OfekShilon谢谢,谢谢您提供的额外信息。
names(a[[1]])
#> [1] "myname"
names(a[[2]])
#> [1] "myname"
sapply
#> function (X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)
#> {
#> FUN <- match.fun(FUN)
#> answer <- lapply(X = X, FUN = FUN, ...)
#> if (USE.NAMES && is.character(X) && is.null(names(answer)))
#> names(answer) <- X
#> if (!isFALSE(simplify) && length(answer))
#> simplify2array(answer, higher = (simplify == "array"))
#> else answer
#> }
#> <bytecode: 0x036ae7a8>
#> <environment: namespace:base>