Если вы хотите вернуть все data.frames, загруженные в глобальную среду, либо представленные как отдельный объект, либо как элемент вложенного списка, используйте rrapply
в rrapply
-пакете (расширение base 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", dfaslist = FALSE)
#> $w
#> X1
#> 1 1
#>
#> $df
#> a b
#> 1 1 2
Здесь dfaslist = FALSE
не будет рекурсивно переходить в столбцы data.frame (как это делает base rapply
), а how = "flatten"
вернет собранные data.frames в виде уплощенного списка.
NB: если вы хотите вернуть полные пути объектов к найденным data.frames, установите how = "prune"
вместо how ="flatten"
:
rrapply(as.list(.GlobalEnv), classes = "data.frame", how = "prune", dfaslist = FALSE)
#> $w
#> X1
#> 1 1
#>
#> $z
#> $z[[1]]
#> $z[[1]]$df
#> a b
#> 1 1 2
Изменить: Чтобы также возвращать data.frames, присутствующие в слотах некоторого класса S4, возможный способ расширения вышеуказанного вызова:
## 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", dfaslist = FALSE)
#> $v
#> user
#> 1 1
#>
#> $w
#> X1
#> 1 1
#>
#> $df
#> a b
#> 1 1 2
В этом case, classes = c("data.frame", "user")
проверит data.frames и S4-объекты класса "user"
. Функция f
, примененная к объекту, возвращает сам объект, если это data.frame, или слот "df"
, если это S4-объект.
Обратите внимание, что этот код предполагает, что S4- известно имя класса, а также слоты, содержащие объекты data.frame.