2010-06-22 17 views
5

Ho una lista di oggetti che ho creato manualmente, come questo:R: girando voci di elenco in oggetti

rand1 <- rnorm(1e3) 
rand2 <- rnorm(1e6) 

myObjects <- NULL 
myObjects[[1]] <-rand1 
myObjects[[2]] <-rand2 
names(myObjects) <- c("rand1","rand2") 

sto lavorando su un codice che raggruppa gli oggetti e li mette in S3 . Poi ho il codice in EC2 che voglio prendere l'elenco myObjects e 'separarlo' automaticamente. In questo esempio l'elenco ha solo due oggetti e i nomi sono noti, ma come faccio a codificarlo per gestire elenchi di qualsiasi lunghezza e nomi?

#pseudo code 
for each thing in myObjects 
    thing <- myObjects[[thing]] 

Non riesco a capire come prendere nomi (MyObjects) [1] e di trasformarlo nel nome di un oggetto per il quale io assegnare il contenuto di MyObjects [[1]]. Sono in grado di gestire il ciclo, ma creare ogni oggetto mi ha bloccato. Sono sicuro che questo è abbastanza semplice, ma non riesco a farlo.

+0

Correlato: http: // stack overflow.com/questions/2590043/creating-a-series-of-vectors-from-a-vector, http://stackoverflow.com/questions/2679193/how-to-name-variables-on-the-fly- in-r, http://stackoverflow.com/questions/2899581/assign-subset-of-parent-table-to-objects-in-r, http://stackoverflow.com/questions/2907896/how-to- assegna-ai-nomi-attributo-del-valore-di-a-variabile-in-r – Marek

+1

Grazie per i collegamenti Marek. Questa diventa una "soluzione angolare" di sorta per la ricerca. Una volta che conosco la funzione che fa ciò che voglio, è molto più facile trovare domande correlate. Il vero problema è capire come arrivare con solo una breve descrizione del problema! –

risposta

10

È possibile utilizzare assign:

for(i in 1:length(myObjects)) assign(names(myObjects)[i], myObjects[[i]]) 
+0

assign() ... questo è il pezzo che mi mancava! grazie sia a te che a Richie per avermi indicato nella giusta direzione. –

+3

'seq_along (myObjects)' è un po 'più sicuro se 'length (myObjects) == 0' – hadley

+0

@hadley: Grazie! seq_along() è una grande scoperta. Come nei seguenti esempi: bad = 'for (i in 1: length (NULL)) print (i)', good = 'for (i in seq_along (NULL)) print (i)' – Shane

5

Per espandere la risposta di Shane:

mapply(assign, names(myObjects), myObjects, MoreArgs=list(envir = globalenv()) 

(si potrebbe desiderare di cambiare globalenv() ad un altro ambiente.)

+0

ottima idea del cambiamento degli ambienti . Dovrei usare quello. Questa è un'idea bonus! –

+0

In questo esempio vedo gli oggetti rand1 e rand2 che vengono creati, ma sembra anche che restituisca l'oggetto myObjects. Se assegno i risultati di questo mapply() a un oggetto, finisco con una copia di myObjects PLUS rand1 e rand2. Un pò rumoroso e sembra inefficiente. Dovrebbe esserci un diverso sapore di applicazione? –

6

attach(myObjects)

+2

Fondamentalmente ho rimosso attach() dal mio vocabolario perché ho scoperto che il modo in cui la maggior parte della gente lo usa risulta in un tipo di codice scadente che è difficile da tracciare. Quindi non ho nemmeno pensato di usarlo in questo caso. Ma ora che ne parli, penso che sia davvero una buona soluzione. Grazie per avermi aiutato a pensare fuori dalla mia piccola scatola. –

+0

+1 Non ha considerato neanche quell'uso. – Shane

+2

Non credo sia sempre una buona idea usare attach. Ma se hai intenzione di usarlo, usalo, non scrivere la tua versione di esso. – hadley