2011-11-24 7 views

risposta

11

La funzione cat stampa su un dispositivo (console per impostazione predefinita) e non aggiunge nessuna delle solite annotazioni, ma non può accettare un elenco come argomento, quindi tutto deve essere un vettore atomico. Il gambetto deparse(substitute()) è il modo per recuperare i nomi degli elenchi passati a una funzione. L'uso di names(x) all'interno della funzione non riesce a recuperare il nome dell'argomento originale.

mylist <- list(first =c(234984, 10354, 41175, 932711, 426928), 
       second =c(1693237, 13462)) 
fnlist <- function(x){ z <- deparse(substitute(x)) 
         cat(z, "\n") 
         nams=names(x) 
        for (i in seq_along(x)) cat(nams[i], x[[i]], "\n")} 
fnlist(mylist) 
mylist 
second 234984 10354 41175 932711 426928 
first 1693237 13462 

Questa versione sarebbe uscita un file (e si potrebbe sostituire "\ t" se si voleva le schede tra i nomi ei valori

fnlist <- function(x, fil){ z <- deparse(substitute(x)) 
         cat(z, "\n", file=fil) 
         nams=names(x) 
        for (i in seq_along(x)){ cat(nams[i], "\t", x[[i]], "\n", 
              file=fil, append=TRUE) } 
         } 
fnlist(mylist, "test") 
+0

Funziona perfettamente! Peccato che richieda molto più codice (rispetto alla scrittura senza nome). Grazie molto! –

+0

Non ho mai capito bene perché non esiste neanche una funzione cat.list. Immagino sia considerato intrinsecamente di basso livello e non adatto alla generalizzazione. –

+0

Inoltre, 'cat' non può gestire oggetti con' lingua' o 'call' (e forse altri). –

6

è possibile ottenere un vettore di stringhe richiesti con:

sapply(names(mylist),function(x) paste(x,paste(mylist[[x]],collapse=" "))) 
            first 
"first 234984 10354 41175 932711 426928" 
            second 
        "second 1693237 13462" 

Poi si può scrivere con write o writeLines.

+0

Anche eccellente e non necessario per il ciclo, grazie! :) –

0

Se si desidera salvare l'elenco per uso futuro in R, considerare il pacchetto rlist.

put:

library("rlist") 
list.save(mylist, "mylist.rds") 

Quindi è possibile recuperare la lista, compresi i nomi, con:

mylist <- list.load("mylist.rds") 

".rds" non darà un file di testo, ma sarà completamente recuperabile. ".yaml" fornirà un file di testo, ma parte della struttura dei dati andrà persa dopo il ricaricamento. ".json" offre quasi il meglio di entrambi, anche se il file di testo potrebbe non essere così leggibile e le strutture di elenco nidificate potrebbero essere semplificate (ad esempio, list(1, 2, 3) diventerà un vettore 1:3).

0

@ 42-

Per aggiungere a 42 di-risposta (avrebbe dovuto essere un commento, ma poi non ho potuto formattare il codice)

Ho bisogno di stampare anche i nomi dell'elemento del di i vettori nella lista, così ho aggiunto questa linea sopra l'istruzione gatto, come segue:

mylist <- list(first =c(a = 234984, b = 10354, c = 41175, d = 932711, e = 426928), 
      second =c(A = 1693237, B = 13462)) 


fnlist <- function(x, fil){ z <- deparse(substitute(x)) 
cat(z, "\n", file=fil) 
nams=names(x) 
for (i in seq_along(x)){ 
    cat("", "\t", paste(names(x[[i]]), "\t"), "\n", file=fil, append=TRUE) 
    cat(nams[i], "\t", x[[i]], "\n", file=fil, append=TRUE) } 
} 
fnlist(mylist, "test") 

risultato

mylist 
     a  b  c  d  e  
first 234984 10354 41175 932711 426928 
     A  B 
second 1693237 13462 
Problemi correlati