Как найти список вложенных наборов данных в 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}
}