20

好的,所以我正在运行一些循环来处理存储在列表对象中的数据。考虑到臭名昭著的fortune告诫不要使用eval(parse(mystring)),我想出了这个:

Rgames> bar
$foo
$foo$fast
[1] 1 2 3 4 5

$foo$slow
[1]  6  7  8  9 10


$oof
$oof[[1]]
[1]  6  7  8  9 10

$oof[[2]]
[1] 1 2 3 4 5


Rgames> rab<-'bar'
Rgames> do.call('$',list(as.name(rab),'oof'))
[[1]]
[1]  6  7  8  9 10

[[2]]
[1] 1 2 3 4 5

通常我会选择一个列表(其中bar一个),然后选择一个 oof包含我的数据的列表元素(例如)。上面的代码与eval(parse(text=paste(rab,'$','oof',sep=''))).
我这样做是因为我想使用列表的名称而不是[[x]]符号作为安全机制(因为并非所有列表对象的内容都以相同的顺序排列)。

我是否应该坚持 R 中 DWin 的建议:eval(parse(...)) 通常不是最理想的

4

2 回答 2

19

使用get[[

bar <- list(foo = list(fast = 1:5, slow = 6:10),
            oof = list(6:10, 1:5))

rab <- 'bar'

get(rab)[['oof']]
# [[1]]
# [1]  6  7  8  9 10
# 
# [[2]]
# [1] 1 2 3 4 5
于 2012-11-30T14:33:25.770 回答
4

如果您的顶级列表的名称将更改并由具有该名称的变量访问,那么最好将这些列表放入另一个列表中,然后您可以访问您想要使用的列表[[。还阅读fortune(312)和帮助?'[['

然后,您可以以不同的方式访问这些片段(在帮助页面上有详细说明?'[[')。

mylist <- list()
mylist$bar <- bar

mylist[[rab]][['oof']]
#or
mylist[[ c(rab,'oof') ]]
于 2012-11-30T17:20:27.893 回答