考虑以下列表:
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的行为感到好奇和困惑。
答案 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))