リストをテキストファイルに書き出し、名前を保持する、R

私は名前を保存して、テキストファイルにリストを書きたい。

これは R:リストをテキストファイルに印刷と似ていますが、各行の先頭にも印刷したい名前を付けます:

> print(head(mylist,2))
$first
[1] 234984  10354  41175 932711 426928
$second
[1] 1693237   13462

mylist.txt
first   234984  10354  41175 932711 426928
second  1693237   13462

何か案は?

どうもありがとう。

8

4 答え

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 

このバージョンではファイルが出力されます(名前と値の間にタブが必要な場合は "\ t"を使用できます)

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")
11
追加された
cat.list関数が存在しない理由もわかりません。私はそれが本質的に低レベルと見なされ、一般化には適していないと思う。
追加された 著者 42-,
また、 language call (おそらく他のクラス)のオブジェクトは cat で処理できません。
追加された 著者 Andy Barbour,
完璧に動作します!恥ずかしくて、(名前のない文章と比べて)はるかに多くのコードが必要です。どうもありがとう!
追加された 著者 Jim Bo,

必要な文字列のベクトルを得ることができます:

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

次に、 write または writeLines を使用して書き込むことができます。

6
追加された
また、優れていて、必要なループはありません。ありがとう! :)
追加された 著者 Jim Bo,

Rで将来使用するためにリストを保存したい場合は、 rlist パッケージを検討してください。

プット:

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

次に、名前を含むリストを以下の方法で復元できます。

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

".rds"はテキストファイルを提供しませんが、完全に回復可能です。 ".yaml"はテキストファイルを出力しますが、データ構造の一部はリロード時に失われます。テキストファイルは読みにくく、ネストされたリスト構造は単純化されているかもしれません(例えば、 list(1,2,3)はベクトル 1:3 )。

2
追加された

@ 42-

42の答えに追加するには(コメントがあったはずですが、コードをフォーマットできませんでした)

リスト内のベクトルの要素の名前も印刷する必要があったので、この行をcat文の上に次のように追加しました:

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 
0
追加された