Как получить все объекты dataframe из пользовательской среды - PullRequest
1 голос
/ 27 апреля 2019

Я хочу получить все кадры данных в сценарии. Для этого я запускаю скрипт в пользовательской среде.

env <- new.env()
source("myScript.R", local = env)

Проблема с этой строкой:

dfs <- ls()[sapply(mget(ls(), env), is.data.frame)]

, который дает мне ошибку: Error: value for ‘env’ not found

но когда я делаю

ls(envir=env)

Я получаю символьную строку со всеми именами объектов.

Что я делаю не так?

Тестовая среда:

env <- new.env()
env$d <- data.frame(a=1)
env$s <- "hello"
env$p <- data.frame(z=1)
env$x <- 2

Я ожидаю, что "d" и "p" будут возвращены.

1 Ответ

2 голосов
/ 27 апреля 2019

Что ж, если вы вызовете ls() без параметра env, в нем будут перечислены только имена в текущей среде. Ваши попытки не передают этот параметр. Другой вариант - использовать eapply, который предназначен для запуска функции над объектами в среде. Например

names(Filter(function(x) x, eapply(env, is.data.frame)))

Это работает, потому что eapply возвращает именованный список. Мы можем просто отфильтровать значения TRUE из is.data.frame и получить эти имена.

Проблема с mget(ls(), env) состоит в том, что ls() собирается вернуть "env", а затем mget() будет искать переменную с именем env в вашей среде env, которая не существует. Вам понадобится

mget(ls(envir=env), env)

И тогда вам нужно будет сделать то же самое для списка элементов, которые вы поднастраиваете

dfs <- ls(envir=env)[sapply(mget(ls(envir=env), env), is.data.frame)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...