查找嵌套列表的哪些元素是数据框

bre*_*auv 3 r nested-lists

假设我有一个如下所示的嵌套列表

\n
test <- list(\n  a = data.frame(x = 1),\n  b = "foo",\n  c = list(\n    d = 1:5,\n    e = data.frame(y = 1),\n    f = "a",\n    list(g = "hello")\n  )\n)\ntest\n#> $a\n#>   x\n#> 1 1\n#> \n#> $b\n#> [1] "foo"\n#> \n#> $c\n#> $c$d\n#> [1] 1 2 3 4 5\n#> \n#> $c$e\n#>   y\n#> 1 1\n#> \n#> $c$f\n#> [1] "a"\n#> \n#> $c[[4]]\n#> $c[[4]]$g\n#> [1] "hello"\n
Run Code Online (Sandbox Code Playgroud)\n

我想知道这个嵌套列表中字符元素的位置。在这种情况下,我想返回一个命名向量或命名列表,其中TRUE元素是否为字符,FALSE否则返回。

\n

我可以用 来做到这一点rapply,它会取消列出所有内容:

\n
rapply(test, is.character)\n#>   a.x     b   c.d c.e.y   c.f   c.g \n#> FALSE  TRUE FALSE FALSE  TRUE  TRUE\n
Run Code Online (Sandbox Code Playgroud)\n

但是,我可以\xe2\x80\x99t 这样做来查找所有数据帧,因为rapply()也取消列出\n数据帧(请注意,第一个元素a.x不仅是a).

\n
rapply(test, is.data.frame)\n#>   a.x     b   c.d c.e.y   c.f   c.g \n#> FALSE FALSE FALSE FALSE FALSE FALSE\n
Run Code Online (Sandbox Code Playgroud)\n

因此,有没有办法找到嵌套列表中的哪些元素是数据帧?\n请注意,该解决方案应该适用于嵌套列表中的任意数量的级别。\n

\n

I\xe2\x80\x99m 仅在基本 R 中寻找解决方案。

\n

G. *_*eck 5

1)申请

library(rrapply)

cls <- c("data.frame", "ANY")
rrapply(test, f = is.data.frame, classes = cls, how = "unlist")
##     a     b   c.d   c.e   c.f   c.g 
##  TRUE FALSE FALSE  TRUE FALSE FALSE 
Run Code Online (Sandbox Code Playgroud)

2)递归

findDF <- function(x) {
  if (is.data.frame(x)) TRUE
  else if (is.list(x)) lapply(x, findDF)
  else FALSE
}

unlist(findDF(test))
##     a     b   c.d   c.e   c.f   c.g 
##  TRUE FALSE FALSE  TRUE FALSE FALSE 
Run Code Online (Sandbox Code Playgroud)