Как найти список прикрепленных наборов данных в R? - PullRequest
8 голосов
/ 28 февраля 2012

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

Ответы [ 4 ]

14 голосов
/ 28 февраля 2012

Полагаю, вы ищете команду search(). Это должно показать вложенные кадры данных и пакеты, которые вы включили.

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

10 голосов
/ 28 февраля 2012

Используйте 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" 
4 голосов
/ 29 февраля 2012

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

3 голосов
/ 27 сентября 2016

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

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

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

intersect(search(), objects())

если вы получаете "character (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] "data.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}
}
...