функция для очистки текущего рабочего пространства, кроме некоторых переменных - PullRequest
0 голосов
/ 20 февраля 2019

Как я могу написать универсальную функцию R, которая очищает текущее рабочее пространство от некоторых определенных пользователем переменных?Конечно, я могу добиться этого в одном скрипте с помощью следующего кода:

prj = '/path/to/project'
src = 'string'
data_to_clean = head(iris)
rm(list = ls()[ !ls() %in% c('prj', 'src') ] )
# only prj and src remain

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

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Если вы заключаете это в функцию, вы должны иметь в виду, что функция при создании создаст свое собственное окружение.Поэтому вам необходимо указывать среду каждый раз (в каждом ls, а также rm).Вы, вероятно, хотите удалить их из .GlobalEnv.

clean_workspace <- function(not_to_be_removed) {
  rm(list = 
    setdiff(ls(envir = .GlobalEnv), c("clean_workspace", not_to_be_removed)), 
    envir = .GlobalEnv)
}

prj = '/path/to/project'
src = 'string'
data_to_clean = head(iris)
clean_workspace(c('prj', 'src'))

Чтобы не удалять саму функцию, ее следует добавить к значениям, которые нельзя удалить.

Если вы хотите узнать больше о средах, посмотрите этот обзор .

0 голосов
/ 20 февраля 2019

Я думаю, что вы хотите удалить саму функцию.Важным битом является указание rm окружению, где удалить эти объекты:

clean_workspace <- function(not_to_be_removed, envir = globalenv()) {
  objs <- ls(envir = envir)
  rm(list = objs[ !objs %in% not_to_be_removed], envir = envir)
}

prj = '/path/to/project'
src = 'string'
data_to_clean = head(iris)
clean_workspace(c('prj', 'src'))
ls()
#> [1] "prj" "src"
...