Avoiding the infamous "eval(parse())" construct
eval, expression, interpreter, parsing, r
Solution
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
Problem
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 ?