Как удалить выбранные переменные R без необходимости вводить их имена
При тестировании моделирования в R с использованием случайно сгенерированных входных данных я обнаружил и исправил несколько ошибок и теперь хотел бы повторно запустить моделирование с теми же данными, , но со всеми промежуточными переменными, удаленными, чтобы гарантировать, что это чистый тест .
Есть ли способ удалить несколько десятков вручную выбранных переменных из рабочей области без необходимости:
а) очистить все рабочее пространство, например rm(list=ls())
, или б) ввести имя каждой переменной, например remove(name1, name2, ...)
?
Идеал решением было бы использовать ls()
для проверки определений, а затем выбрать индексы тех, которые я хочу удалить, например
ls() # inspect definitions
delme <- c(3,5,7:9,11,13) # names selected for removal
remove(ls()[delme]) # DESIRED SOLUTION -- doesn't quite work this way
(оглядываясь назад, я должен был использовать фиксированное семя для генерации случайных входных данных, которые позволяют очистить все, а затем повторно запустить тест...)
4 ответа:
Асад, хотя я думаю, что фактический ответ на этот вопрос содержится в комментариях, позвольте мне предложить этот шаблон в качестве более широкого решения:
rm(list= Filter( Negate(is.na), # filter entries corresponding to objects that don't meet function criteria sapply( ls(pattern="^a"), # only objects that start with "a" function(x) if(is.matrix(get(x))) x else NA # return names of matrix objects ) ) )
В этом случае я удаляю все матричные объекты, которые начинаются с "a". Изменяя аргумент
pattern
и функцию, используемую здесьsapply
, Вы можете получить довольно точный контроль над тем, что вы удаляете, без необходимости указывать много имен.Если вы обеспокоены тем, что это может удалить что-то, что вы не хотите удалять, вы можете сохранить результат операция
Filter(...
в переменной, просмотрите содержимое, а затем выполните командуrm(list=...)
.
Существует гораздо более простое и прямое решение:
vars.to.remove <- ls() vars.to.remove <- temp[c(1,2,14:15)] rm(list = vars.to.remove)
Или, еще лучше, если вы хорошо разбираетесь в схемах именования переменных , Вы можете использовать следующую стратегию сопоставления шаблонов:
Например, я называю все временные переменные начальной строкой " Temp." ... так что у тебя может быть темп.Имена, Темп.Значения, Темп.Что угодно
Ниже приведен список переменных, которые соответствуют этому шаблону
ls(pattern = "Temp.")
Таким образом, вы можете удалить все ненужные переменные использование один строка кода, следующая:
rm(list = ls(pattern = "Temp."))
Надеюсь, это поможет.
У меня было аналогичное требование. Я собрал все необходимые элементы в список:
Затем я переназначаю те немногие значения, которые хочу сохранить, новыми именами переменных, которых не будет в переменной varsToPurge. После этого я прошелся по элементамvarsToPurge = as.list(ls())
for (j in 1:length(varsToPurge)){ rm(list = as.character(varsToPurge[j])) }
Сделайте небольшой сбор мусора, и вы поддерживаете чистую среду, когда проходите через свой код.
gc()
Вы также можете использовать вектор номеров строк, который вы хотите сохранить, и запустить его в цикле но это не будет так динамично, если вы добавите грубую работу, которую хотите удалить.