Как удалить выбранные переменные 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 4

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."))

Надеюсь, это поможет.

Попробуйте

Функции eval(разбора(текст= "вставить" ("РМ ("вставьте(ЛС()[делм],сентября=","),")")))

У меня было аналогичное требование. Я собрал все необходимые элементы в список:

varsToPurge = as.list(ls())
Затем я переназначаю те немногие значения, которые хочу сохранить, новыми именами переменных, которых не будет в переменной varsToPurge. После этого я прошелся по элементам
for (j in 1:length(varsToPurge)){
  rm(list = as.character(varsToPurge[j]))
}

Сделайте небольшой сбор мусора, и вы поддерживаете чистую среду, когда проходите через свой код.

gc()

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