2

R で任意のディープ リスト (リストとベクトルを含む) を再帰的にパスのベクトルに変換するエレガントな方法はありますか? たとえば、これを変換します。

list(
  home = list(
    jerry = c("R", "bla"),
    mary = "xx"
  ),
  tmp = c("foo", "bar"),
  c("etc")
)

このようなオブジェクトに:

c(
  "/home/jerry/R",
  "/home/jerry/bla",
  "/home/mary/xx",
  "/tmp/foo",
  "/tmp/bar",
  "/etc"
 )
4

3 に答える 3

1

の名前は、unlistおおよそあなたが望むことを行います:

> test <- list(
+     home = list(
+         jerry = c("R", "bla"),
+         mary = "xx"
+     ),
+     tmp = c("foo", "bar"),
+     etc = c()
+ )
> unlist(test)
home.jerry1 home.jerry2   home.mary        tmp1        tmp2 
        "R"       "bla"        "xx"       "foo"       "bar" 

複数レベルの再帰も処理します。

> test <- list(
+     home = list(
+         jerry = list(a="R", b="bla"),
+         mary = list(c="xx")
+     ),
+     tmp = list(d="foo", e="bar"),
+     etc = list(nothing=NULL)
+ )
> unlist(test)
home.jerry.a home.jerry.b  home.mary.c        tmp.d        tmp.e 
         "R"        "bla"         "xx"        "foo"        "bar" 

そこから、必要な最後のビットを簡単に追加できます (最終的な値は最後のパス要素になります)。

> unl <- unlist(test)
> res <- names(unl)
> res <- paste(res,unl,sep=".")
> res
[1] "home.jerry.a.R"   "home.jerry.b.bla" "home.mary.c.xx"   "tmp.d.foo"        "tmp.e.bar"       
于 2013-05-21T20:44:52.637 に答える