避免臭名昭着的“eval(parse())”构造 [英] avoiding the infamous "eval(parse())" construct
问题描述
财富
警告不要使用 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
d选择一个列表(其中 bar
是一个),然后选择列表中的一个元素(例如 oof
)其中包含我的数据。上面的代码与 eval(parse(text = paste(rab,'$','oof',sep =''))))
相同。
我正在做所有这一切,因为我想使用列表的名称而不是 [[x]]
符号作为安全机制(因为不是所有的列表对象的内容按照相同的顺序)。我应该坚持在 R:eval(parse(...))中的DWin的建议次优?
使用 get
和 [[
:
bar< - list(foo = list :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
Ok, so I'm running some loops to process data stored in list objects. Ever mindful of the infamous fortune
admonishment not to use eval(parse(mystring))
, I came up with this:
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
Typically I'd be selecting a list (of which bar
is one such) and then one element of the list (e.g. oof
) which contains my data. The code above does the same thing as eval(parse(text=paste(rab,'$','oof',sep='')))
.
I'm doing all this specifically because I want to use the lists' names rather than [[x]]
notation as a safety mechanism (because not all list objects have their contents in the same order). Should I stick with the advice from DWin in R: eval(parse(...)) 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
这篇关于避免臭名昭着的“eval(parse())”构造的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!