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

2024-03-27

好的,所以我正在运行一些循环来处理存储在列表对象中的数据。永远铭记那些臭名昭著的人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]]表示法作为一种安全机制(因为并非所有列表对象的内容都按相同的顺序排列)。

我应该坚持 DWin 的建议吗R: eval(parse(...)) 通常不是最优的 https://stackoverflow.com/questions/11025031/r-evalparse-is-often-suboptimal ?


Using get and [[:

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

避免臭名昭著的“eval(parse())”构造 的相关文章