好的,所以我正在运行一些循环来处理存储在列表对象中的数据。想到臭名昭著的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: eval(parse(...)) is often suboptimal中获得DWin的建议吗?
最佳答案
使用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
关于r - 避免臭名昭著的 “eval(parse())”构造,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13647046/