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 ?
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
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') ]]