Eviter la fameuse construction "eval(parse())"

Ok, donc j'exécute quelques boucles pour traiter les données stockées dans les objets list. Toujours conscient de l'infâme fortune avertissement de ne pas utiliser eval(parse(mystring)) , je suis venu avec ceci:

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

typiquement, Je sélectionnerais une liste (dont bar est un tel) et puis un élément de la liste (par exemple oof ) qui contient mes données. Le code ci-dessus fait la même chose que eval(parse(text=paste(rab,'$','oof',sep=''))) .

Je fais tout ça spécifiquement. parce que je veux utiliser les noms des listes plutôt que la notation [[x]] comme mécanisme de sécurité (parce que tous les objets list n'ont pas leur contenu dans le même ordre). Si je m'en tiens au Conseil de DWin dans R: eval (...)) est souvent sous-optimale ?

14
demandé sur Community 2012-11-30 18:24:15

2 réponses

utilisant get et [[ :

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
15
répondu flodel 2012-11-30 14:33:25

si le nom de votre liste supérieure va changer et être accédé par une variable avec le nom, alors il est préférable de mettre ces listes dans une autre liste, alors vous pouvez accéder à la liste que vous voulez en utilisant [[ . Lisez aussi fortune(312) et l'aide sur ?'[[' .

vous pouvez alors accéder aux pièces de différentes manières (détaillées sur la page d'aide ?'[[' ).

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

mylist[[rab]][['oof']]
#or
mylist[[ c(rab,'oof') ]]
3
répondu Greg Snow 2012-11-30 17:20:27