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 ?

Original source