Как найти список вложенных наборов данных в R?

есть ли какой-либо метод в R чтобы выяснить, какие наборы данных были прикреплены. В моем рабочем потоке я использую консоль и создаю сценарий. Я пробую строки кода в консоли, и как только я удовлетворен результатами, я добавляю их в сценарий, чтобы я мог воспроизвести результаты позже. На прошлой неделе я играл с несколькими наборами данных. Я думаю, что со временем я присоединил и отделил несколько из них. Но теперь мне нужно знать, какие наборы данных являются текущими, чтобы я мог отсоединить их.

4 ответов


Я думаю, вы ищете . Это должно показать вложенные фреймы данных и пакеты, которые вы включили.

также типа help(search) и проверьте, что он делает.


использовать search() чтобы узнать, какие объекты прикреплены.

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

прикрепить mtcars:

attach(mtcars)
The following object(s) are masked from 'package:ggplot2':

    mpg

теперь использовать search() и регулярное выражение:

attached <- search()
attached[!grepl("package", attached)]
[1] ".GlobalEnv"    "mtcars"        "tools:rstudio" "Autoloads" 

чтобы избежать этой проблемы, лучше не использовать attach и detach для наборов данных. Вы также можете столкнуться с проблемой наличия одной и той же переменной, определенной в 2 или более вложенных наборах данных (и, возможно, в глобальной среде), и случайно получить неправильный. Лучше использовать аргумент data для таких функций, как plot и lm и использовать такие функции, как with, within и transform для других случаев. Тогда R всегда будет смотреть первым в указанном наборе данных и не покидать его прилагается впоследствии.


чтобы привести ответ в соответствие с предложениями в комментариях, я разделяю код на три части. Первый просто создает список вложенных наборов данных. Второй удаляет один экземпляр вложенных наборов данных. Третий обрабатывает ситуации, когда набор данных был присоединен несколько раз:

1. Выходной список вложенных наборов данных

этот код создаст список прикрепленных наборов данных для пользователя исследуйте:

intersect(search(), objects())

если вы получаете "символ (0)" - в глобальном env

2. Автоматически "Очистка" И Отсоединить Все Прикрепленные Наборы Данных

этот код возьмет этот список прикрепленных наборов данных и отсоединит все прикрепленные объекты (наборы данных). Он должен оставить не-объекты в покое. Таким образом, это довольно простой, безопасный и надежный способ "очистки" глобальной окружающей среды:

Примечание: это будет работать только если каждый объект прикрепляется только один раз, в противном случае вам придется снова выполнить команду. Следующая часть ответа касается и этого случая.

#works if only attached each object once
lapply(X = intersect(search(), objects()), 
FUN = function(X){detach(name = X, character.only = TRUE)})

3. Отсоедините Все, Даже Если Объекты Присоединены Несколько Раз

3 (a) несколько вложений Этот код отсоединит все присоединенные объекты (наборы данных), даже если они были присоединены несколько раз. Вышеуказанная операция не может справиться с этим, потому что R не будет включать имя объект дважды, даже если он был прикреплен дважды пользователем.

так:

attach(data.df)
intersect(search(), objects())

и

attach(data.df)
attach(data.df)
attach(data.df)
intersect(search(), objects())

произведет такой же выход:[1] "Сведения.df"

хотя последний случай нуждается detach(data.df) называться три раза, чтобы очистить окружающую среду. В результате нам нужно поместить ответ из части 2 в цикл.

3 (b) произведите выход для потребителя Кроме того, в ходе очистки будет выведен список имена наборов данных для каждой успешной операции " detach ()". Это позволяет пользователю узнать, какие наборы данных были отсоединены и сколько раз.

примечание: Я уверен, что это можно было бы немного очистить, но этот кусок кода получает работу надежно.

# the repeat handles cases where objects of identical name were 
# attached (or, object was attached twice by mistake). 
# It also outputs the name of objects as they are detached. 

repeat{
  x <- lapply(X = intersect(search(), objects()),
         FUN = function(X){detach(name = X, character.only = TRUE)})

  y <- lapply(x, function(X){cat(attr(X,"name"), "\n")})

  if(identical(x, list())){break}
}