2012-02-26 6 views
13

Estoy tratando de usar get() para acceder a un elemento de lista en r, pero estoy obteniendo un error.Elemento de lista de acceso en r utilizando get()

example.list <- list() 
example.list$attribute <- c("test") 
get("example.list") # Works just fine 
get("example.list$attribute") # breaks 

error en get ("$ atributo example.list"): objeto 'example.list $ atributo' no encontrado

Algún consejo? Estoy recorriendo un vector de cadenas que identifican los nombres de las listas, y esto sería realmente útil.

+1

La razón por la que se obtiene un error es que 'example.list $ attribute' no es un objeto, sino que es el resultado de aplicar el operador (' $ ', aka Extract, try -'? '" Backtick " '$' "backtick) al par' (ejemplo.lista, atributo) '. – Ryogi

Respuesta

20

Aquí está el encantamiento que usted está probablemente en busca de:

get("attribute", example.list) 
# [1] "test" 

O tal vez, por su situación, esto:

get("attribute", eval(as.symbol("example.list"))) 
# [1] "test" 

# Applied to your situation, as I understand it... 

example.list2 <- example.list 
listNames <- c("example.list", "example.list2") 
sapply(listNames, function(X) get("attribute", eval(as.symbol(X)))) 
# example.list example.list2 
#  "test"  "test" 
+0

su primer ejemplo es el que me funciona, ¿es la manera más o la única para hacerlo? Tengo una lista de listas que solo puedo acceder por mylist [[1]] [1] o mylist [[1]] $ elementname. –

2

Si sus cadenas contienen más que los nombres de objeto, por ejemplo, operadores como aquí, se pueden evaluar como expresiones de la siguiente manera:

> string <- "example.list$attribute" 
> eval(parse(text = string)) 
[1] "test" 

Si sus cadenas son todos del tipo "objeto $ atributo", también se ha podido analizar ellos en objeto/atributo, por lo que todavía puede get la objeto, a continuación, extraer el atributo con [[:

> parsed <- unlist(strsplit(string, "\\$")) 
> get(parsed[1])[[parsed[2]]] 
[1] "test" 
3

por qué no simplemente:

example.list <- list(attribute="test") 
listName <- "example.list" 
get(listName)$attribute 

# or, if both the list name and the element name are given as arguments: 
elementName <- "attribute" 
get(listName)[[elementName]] 
-2

respuesta de flodel trabajó para mi aplicación, así que voy a posterior w que construí sobre él, aunque esto no está muy inspirado. Puede acceder a cada elemento de la lista con un bucle for, así:

#============== List with five elements of non-uniform length ================# 
example.list= 
list(letters[1:5], letters[6:10], letters[11:15], letters[16:20], letters[21:26]) 
#===============================================================================# 
#====== for loop that names and concatenates each consecutive element ========# 
derp=c();   for(i in 1:length(example.list)) 
{derp=append(derp,eval(parse(text=example.list[i])))} 
derp #Not a particularly useful application here, but it proves the point. 

estoy usando código como este para una función que llama a ciertos conjuntos de columnas de una trama de datos con los nombres de las columnas. El usuario ingresa una lista con elementos que representan diferentes conjuntos de nombres de columna (cada conjunto es un grupo de elementos que pertenecen a una medida) y el marco de datos grandes que contiene todas esas columnas. El bucle for aplica cada elemento de lista consecutiva como el conjunto de nombres de columna para una función interna * aplicada solo al conjunto de columnas del big data frame actualmente nombrado. A continuación, rellena una columna por ciclo de una matriz con la salida para el subconjunto de la trama de datos grandes que corresponde a los nombres en el elemento de la lista correspondiente al número de ese bucle. Después del bucle for, la función finaliza al generar la matriz que produjo.

No estoy seguro si está buscando hacer algo similar con los elementos de su lista, pero estoy contento de haber tomado este truco. Gracias a todos por las ideas!

"Segundo ejemplo" info/tangencial respecto a la aplicación del factor de modelo de respuesta gradual anotando:

Aquí es la función que he descrito anteriormente, por si acaso alguien quiere calcular puntuaciones de los factores modelo respuesta gradual * en gran lotes ... Cada columna de la matriz de salida corresponde a un elemento de la lista (es decir, un rasgo latente con elementos del indicador ordinal especificado por nombre de columna en el elemento de lista), y las filas corresponden a las filas del marco de datos utilizado como entrada. Cada fila debería contener supuestamente observaciones mutuamente dependientes, como de un individuo dado, a quien pertenecen las puntuaciones de los factores en la misma fila de la matriz de salida.Además, creo que debo agregar que si todos los elementos de un elemento de lista determinado utilizan exactamente las mismas opciones de calificación de escala Likert, el modelo de respuesta gradual puede ser menos apropiado para la calificación de factores que un modelo de escala de calificación (http://www.rasch.org/rmt/rmt143k.htm).

'grmscores'=function(ColumnNameList,DataFrame) {require(ltm) #(Rizopoulos,2006) 
x = matrix (NA , nrow = nrow (DataFrame), ncol = length (ColumnNameList)) 
for(i in 1:length(ColumnNameList)) #flodel's magic featured below!# 
{x[,i]=factor.scores(grm(DataFrame[, eval(parse(text= ColumnNameList[i]))]), 
resp.patterns=DataFrame[,eval(parse(text= ColumnNameList[i]))])$score.dat$z1}; x} 

referencia

* Rizopoulos, D. (2006). ltm: Un paquete R para análisis de la teoría de respuesta de elementos y modelos de variables latentes, Journal of Statistical Software, 17 (5), 1-25. URL: http://www.jstatsoft.org/v17/i05/

+1

downvotes sin comentarios? – flies

Cuestiones relacionadas