使用sapply获取列表向量

时间:2018-01-20 19:21:08

标签: r functional-programming

考虑以下列表:

temp <- list(1, "a", TRUE)

我们可以使用sapply复制列表:

> ts <- sapply(1:5, function(x) temp)
> ts
      [,1] [,2] [,3] [,4] [,5]
id    1    1    1    1    1   
grade "a"  "a"  "a"  "a"  "a" 
alive TRUE TRUE TRUE TRUE TRUE

如果我使用typeof检查结果,我会获得list。但是,如果我用sapply检查它,我会得到这个:

> sapply(ts, function(x) print(x))
[1] 1
[1] "a"
[1] TRUE
[1] 1
[1] "a"
[1] TRUE
[1] 1
[1] "a"
[1] TRUE
[1] 1
[1] "a"
[1] TRUE
[1] 1
[1] "a"
[1] TRUE

也就是说,当我用sapply检查相同的结果时,这个列表向量被视为一个矩阵。是否有任何解决方法,或者R一般不允许列表向量?如果是后者,为什么我会从"list"获得typeof

PS:对于我的具体问题,我理解使用lapply切换到列表列表的明显解决方案。我对R的行为感到好奇和困惑。

1 个答案:

答案 0 :(得分:0)

sapply(ts, function(x) print(x))的返回仍然是一个列表。实际上,作为temp的3个成员的15个变量的列表已被简化并返回为3个项目(乘以5次迭代)。如果您想要类似lapply之类的输出,请尝试:

>ts <- sapply(1:5, function(x) temp, simplify = FALSE)
> ts
#[[1]]
#[[1]][[1]]
#[1] 1
#
#[[1]][[2]]
#[1] "a"
#
#[[1]][[3]]
#[1] TRUE
#.......
#.......

甚至你可以尝试:

>ts <- sapply(1:5, function(x) as.data.frame(temp))