避免臭名昭着的“eval(parse())”构造

问题描述 投票:19回答:2

好的,所以我正在运行一些循环来处理存储在列表对象中的数据。我注意到臭名昭着的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的建议吗?

r parsing expression eval interpreter
2个回答
16
投票

使用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

3
投票

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

然后,您可以通过不同的方式访问这些部分(详情请参阅帮助页面?'[[')。

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

mylist[[rab]][['oof']]
#or
mylist[[ c(rab,'oof') ]]
© www.soinside.com 2019 - 2024. All rights reserved.