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