2012-02-26 18 views
13

Sto provando a usare get() per accedere a un elemento di lista in r, ma sto ricevendo un errore.Elemento di accesso in r usando get()

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

Error in get ("$ attributo example.list"): oggetto 'example.list $ attributo' non trovato

Qualche consiglio? Sto girando su un vettore di stringhe che identificano i nomi delle liste e questo sarebbe davvero utile.

+1

Il motivo per cui si ottiene un errore è che 'esempio.list $ attributo' non è un oggetto ma è il risultato dell'applicazione dell'operatore (' $ ', alias Extract, try -'? '" Backtick " '$'" backtick) alla coppia '(example.list, attribute)'. – Ryogi

risposta

20

Ecco l'incantesimo che si sono probabilmente alla ricerca di:

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

O forse, per la situazione, in questo modo:

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

il tuo primo esempio è quello che funziona per me, è il modo più o meno valido per farlo? Ho una lista di liste che posso accedere solo da mylist [[1]] [1] o mylist [[1]] $ elementname. –

2

Se le stringhe contengono più di un semplice oggetto nomi, per esempio operatori come qui, è in grado di valutare come espressioni come segue:

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

Se le stringhe sono tutti del tipo "oggetto $ attributo", si potrebbe anche li analizza in oggetto/attributo, in modo da poter ancora get la oggetto, quindi estrarre l'attributo con [[:

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

Perché non semplicemente:

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

risposta di flodel ha lavorato per la mia applicazione, in modo da sto andando posta w cappello che ho costruito su di esso, anche se questo è piuttosto privo di ispirazione. È possibile accedere a ogni elemento della lista con un ciclo for, in questo modo:

#============== 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. 

sto usando codice come questo per una funzione che chiama certi insiemi di colonne da un frame di dati con i nomi delle colonne. L'utente inserisce una lista con elementi che rappresentano ciascuno diversi insiemi di nomi di colonne (ogni insieme è un gruppo di elementi appartenenti a una misura) e il grande riquadro di dati contenente tutte quelle colonne. Il ciclo for applica ciascun elemento di elenco consecutivo come il set di nomi di colonna per una funzione interna * applicata solo al set di colonne correntemente denominato del frame di dati grandi. Quindi popola una colonna per loop di una matrice con l'output per il sottoinsieme del frame di dati grande che corrisponde ai nomi nell'elemento della lista corrispondente al numero di quel loop. Dopo il ciclo for, la funzione termina emettendo quella matrice prodotta.

Non sono sicuro se stai cercando di fare qualcosa di simile con i tuoi elementi della lista, ma sono felice di aver colto questo trucco. Grazie a tutti per le idee!

"Secondo esempio"/info tangenziale per quanto riguarda l'applicazione del fattore di modello di risposta graduale segnando:

Ecco la funzione che ho descritto sopra, nel caso in cui qualcuno vuole calcolare Factor Model risposta graduata punteggi * in gran lotti ... Ogni colonna della matrice di output corrisponde a un elemento della lista (cioè un tratto latente con elementi di indicatore ordinale specificati dal nome della colonna nell'elemento di elenco) e le righe corrispondono alle righe del frame di dati utilizzato come ingresso. Ogni riga dovrebbe presumibilmente contenere le osservazioni reciprocamente dipendenti, come da un dato individuo, a cui appartengono i punteggi fattoriali nella stessa riga della matrice ouput.Inoltre, sento che dovrei aggiungere che se tutti gli elementi di un dato elenco utilizzano le stesse identiche opzioni di valutazione della scala Likert, il modello di risposta graduata potrebbe essere meno appropriato per il punteggio dei fattori rispetto a un modello di scala di valutazione (vedere 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} 

riferimento

* Rizopoulos, D. (2006). ltm: pacchetto R per analisi di modelli di variabili latenti e analisi della risposta degli elementi, Journal of Statistical Software, 17 (5), 1-25. URL: http://www.jstatsoft.org/v17/i05/

+1

downvotes senza commenti? – flies