虚拟例子:
1> L = vector('list',100)#prefill empty list
1> for (i in 1:100){
1+ L[[i]]$letter = letters[rgeom(1,.5)+1]#populate it with a letter
1+ L[[i]]$number = runif(1)#and a number
1+ }
1> i = ceiling(runif(100,0,100))#an (arbitrary) vector of indices
1> x = L[[i]]$letter #I want the ith letter
Error in L[[i]] : no such index at level 2
我希望x
包含letter
i
元素的L
对象。 (i
的顺序与x
的索引顺序没有任何关系
没有循环,这样做的好方法是什么?
以下是我的编辑器的复制/粘贴,而不是我的终端窗口,对于那些可能更容易找到它的人来说:
L = vector('list',100)
for (i in 1:100){
L[[i]]$letter = letters[rgeom(1,.5)+1]
L[[i]]$number = runif(1)
}
i = ceiling(runif(100,0,100))
x = L[[i]]$letter
答案 0 :(得分:2)
相关文档位于help("[[")
:
[
,[[
和$
之间最重要的区别是[
可以选择多个元素,而另外两个选择单个元素。
因此,我们需要使用L[i]
提取值。
从那里,要访问$letter
每个元素的L[i]
部分,我们可以使用sapply
:
sapply(L[i], `[[`, "letter")
在这里使用$
代替[[
很诱人,但for obscure reasons, it's not a good idea。
评论。这是构建一些示例数据的另一种方法。
set.seed(1)
L = replicate(100, list(
letter = letters[rgeom(1,.5)+1],
number = runif(1)
), simplify = FALSE)
i = sample(100, 100, replace=TRUE)
将set.seed
放在随机生成的示例之前通常很有用,这样每个人都在看同样的事情。