如果您想返回全局环境中加载的所有 data.frames,无论是作为单个对象还是作为嵌套列表的元素,请在 rrapply-package 中使用 rrapply(基础 rrapply 的扩展) .
library(rrapply)
w <- data.frame(1)
x <- list(1, 2, 3)
y <- 5
z <- list(1, 2, list(1, df = data.frame(a = 1, b = 2)))
rrapply(as.list(.GlobalEnv), classes = "data.frame", how = "flatten")
#> $w
#> X1
#> 1 1
#>
#> $df
#> a b
#> 1 1 2
设置classes = "data.frame" 可避免递归到data.frame 列(就像基本rapply 一样),how = "flatten" 会将收集到的data.frames 作为扁平列表返回。
注意:如果要返回找到的 data.frames 的完整对象路径,请设置 how = "prune" 而不是 how ="flatten":
rrapply(as.list(.GlobalEnv), classes = "data.frame", how = "prune")
#> $w
#> X1
#> 1 1
#>
#> $z
#> $z[[1]]
#> $z[[1]]$df
#> a b
#> 1 1 2
编辑:为了也返回存在于某些 S4 类插槽中的 data.frames,扩展上述调用的一种可能方法是:
## define S4-class with a data.frame in "df" slot
userClass <- setClass("user", slots = c(df = "data.frame"))
v <- userClass(df = data.frame(user = 1))
rrapply(as.list(.GlobalEnv),
classes = c("data.frame", "user"),
f = function(x) {
if(class(x) == "user") {
slot(x, "df")
} else {
x
}
},
how = "flatten")
#> $v
#> user
#> 1 1
#>
#> $w
#> X1
#> 1 1
#>
#> $df
#> a b
#> 1 1 2
在这种情况下,classes = c("data.frame", "user") 将检查 "user" 类的 data.frames 和 S4 对象。应用于对象的f 函数,如果它是一个data.frame,则返回对象本身;如果它是一个S4 对象,则返回"df" 槽。
请注意,此代码假定 S4 类名称以及包含 data.frame 对象的插槽是已知的。