2011-11-24 10 views

Odpowiedz

11

Funkcja cat będzie drukować na urządzeniu (domyślnie konsola) i nie będzie dodawać żadnych zwykłych adnotacji, ale nie może przyjąć listy jako argumentu, więc wszystko musi być wektorem atomowym. Gambit deparse(substitute()) jest sposobem na odzyskanie nazw list, które zostały przekazane do funkcji. Używanie tylko names(x) wewnątrz funkcji nie pozwala odzyskać nazwy oryginalnego argumentu.

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 

Ta wersja będzie wyjściowy plik (i można zastąpić „\ t”, jeśli chciał zakładek pomiędzy nazwami i wartościami

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

Działa idealnie! Szkoda, że ​​wymaga znacznie więcej kodu (w porównaniu do pisania bez nazwy). Wielkie dzięki! –

+0

Nigdy nie do końca zrozumiałem, dlaczego funkcja cat.list też nie istnieje. Sądzę, że jest to postrzegane jako samoistnie niskiego poziomu i nie nadaje się do generalizacji. –

+0

Zwróć też uwagę, że 'cat' nie może obsługiwać obiektów z klasą' language' lub 'call' (i być może z innymi). –

6

Można uzyskać wektor strun, które wymagają z:

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

Następnie można napisać go write lub writeLines.

+0

Również doskonałe i bez pętli potrzebne, dzięki! :) –

0

Jeśli chcesz zapisać listę do wykorzystania w przyszłości, rozważ pakiet rlist.

put:

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

Następnie można odzyskać listy, w tym imion, z:

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

".rds" nie da się plik tekstowy, ale będzie zupełnie zwrotowi. ".yaml" da plik tekstowy, ale część struktury danych zostanie utracona po ponownym wczytaniu. ".json" prawie daje najlepsze z nich, chociaż plik tekstowy może nie być tak czytelny, a struktury zagnieżdżonych list mogą być uproszczone (np. list(1, 2, 3) stanie się wektorem 1:3).

0

@ 42-

Aby dodać do 42-na odpowiedź (powinien być komentarz, ale potem nie mogłem sformatować kod)

musiałem wydrukować również nazwiska element z dnia wektory na liście, więc dodałem tę linię powyżej rachunku kot, co następuje:

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") 

wynik

mylist 
     a  b  c  d  e  
first 234984 10354 41175 932711 426928 
     A  B 
second 1693237 13462 
Powiązane problemy