Evitar el constructo infame "eval(parse())"
parsing expression (2)
Si el nombre de su lista principal va a cambiar y será accedido por una variable con el nombre, entonces lo mejor es poner esas listas en otra lista, entonces puede acceder a la lista que desea usando [[
. También lea la fortune(312)
y la ayuda en ?''[[''
.
Luego puede acceder a las piezas de diferentes maneras (detalladas en la página de ayuda ?''[[''
).
mylist <- list()
mylist$bar <- bar
mylist[[rab]][[''oof'']]
#or
mylist[[ c(rab,''oof'') ]]
Ok, entonces estoy ejecutando algunos bucles para procesar datos almacenados en objetos de lista. Siempre consciente de la infame advertencia de la fortune
no usar eval(parse(mystring))
, se me ocurrió esto:
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
Por lo general, seleccionaría una lista (de qué bar
es una de ellas) y luego un elemento de la lista (por ejemplo, oof
) que contiene mis datos. El código anterior hace lo mismo que eval(parse(text=paste(rab,''$'',''oof'',sep='''')))
.
Estoy haciendo todo esto específicamente porque quiero usar los nombres de las listas en lugar de la notación [[x]]
como un mecanismo de seguridad (porque no todos los objetos de la lista tienen su contenido en el mismo orden).
¿Debo seguir los consejos de DWin en R: eval (parse (...)) es a menudo subóptimo ?
Usando get
y [[
:
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