Чтобы привести ответ в соответствие с предложениями в комментариях, я разделяю код на три части. Первый просто создает список прикрепленных наборов данных. Второй удаляет один экземпляр прикрепленных наборов данных. Третий обрабатывает ситуации, когда набор данных был присоединен несколько раз:
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}
}