2011-11-24 93 views

回答

11

cat函數將打印到設備(默認爲控制檯),並且不添加任何常用註釋,但它不能接受列表作爲參數,因此所有內容都必須是原子向量。 deparse(substitute()) gambit是恢復傳遞給函數的列表名稱的方式。在函數內部只需使用names(x)將無法​​恢復原始參數的名稱。

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 

此版本將輸出文件(你可以,如果你的名字之間想要的標籤和值

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

完美地工作!羞愧它需要更多的代碼(與沒有名字的寫作相比)。非常感謝! –

+0

我從來沒有想過爲什麼cat.list函數不存在,要麼。我想它被認爲是內在的低層次,不適合泛化。 –

+0

另請注意'cat'不能處理class'language'或'call'(也可能是其他類)的對象。 –

6

你可以得到你需要與一個字符串矢量替代「\ t」的:

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

然後你就可以用writewriteLines寫。

+0

也非常好,不需要循環,謝謝! :) –

0

如果您想保存列表以備將來在R中使用,請考慮rlist軟件包。

地說:

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

然後你就可以收回名單,包括姓名,具有:

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

「.rds」 不會給一個文本文件,但會完全恢復。 「.yaml」會給出一個文本文件,但是一些數據結構在重新加載時會丟失。儘管文本文件可能不太可讀,並且嵌套列表結構可能被簡化(例如,list(1, 2, 3)將變成矢量1:3),但「.json」幾乎給出了兩者中的最佳結果。

0

@ 42-

要添加到42的回答(應該是一個評論,但隨後我無法格式化代碼)

我需要同時打印元素的的姓名在列表中的載體,所以我說這行貓上述聲明,如下:

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

結果

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