【发布时间】:2020-10-14 21:56:30
【问题描述】:
我将一些问题简化为以下玩具代码:
cc<-c("1","2")
ff<-function(x) { list(myname=x)}
aa<-unlist(lapply(cc,ff))
bb<-sapply(cc,ff)
I'd expect aa 和 bb 相同,但是:
> aa
myname myname
"1" "2"
> bb
$`1.myname`
[1] "1"
$`2.myname`
[1] "2"
不过,我知道 USE.NAMES 参数是 sapply -
- documented 为 -
USE.NAMES 逻辑;如果 TRUE 并且 X 是字符,则使用 X 作为名称 结果除非它已经有名字。
所以在这种情况下应该没有影响,
- 在内部,它甚至没有传递给 simple2array,因此也没有传递给最终的 unlist。
这里发生了什么?这可能是 R 问题吗?
编辑:经过进一步调查,结果发现差异的根本原因是 sapply 基本上等同于不
unlist(lapply(cc,ff)
而是为了
unlist(lapply(cc, ff), recursive = FALSE)
(这是确切的内部 unlist 调用)。
【问题讨论】:
-
但
cc没有名称,因此添加了它们 -
@user20650 ff 添加名称。
-
我把“除非它有名字”中的 it 当作 X 输入而不是结果,但是在重新阅读时我可能会弄错
-
...(就像这里发生的事情
names(cc) = c("A", "B"); sapply(cc,ff))
标签: r