Хранить пользовательские функции в глобальной среде, при удалении объектов - PullRequest
0 голосов
/ 09 января 2019

Вопрос: Как я могу контролировать удаление (и сохранение) пользовательской функции?

Что я пробовал до сих пор:

Я получил рекомендацию ставить точку [.] В начале каждой функции, когда мне говорят, что функции не будут удалены. При тестировании функция удаляется, несмотря на то, что она начинается с точки.

Требования:

  • Все «не-функции» должны обрабатываться [rm].

  • Из-за автоматизации процедура должна запускаться с помощью базы R с терминала. Мало того, что решение работает только в Rstudio.

  • Глобальная среда, которая будет использоваться, благодаря сохранению стандартизированного решения.

  • Если возможно, можно определить, какую функцию сохранить / удалить.

Ожидаемый результат:

  • Ни одна из функций в примере не должна быть удалена.

Ниже приведен пример кода:

# Create 3 object variables.
a <- 1
b <- 2
c <- 3

# Create 3 functions.
myFunction1 <- function() {}
myFunction2 <- function() {}
myFunction3 <- function() {}

# Remove all from global.env.
# Keep the ones specified below.
rm(list = ls()[! ls() %in% c(
  "a",
  "c"
)
]
)

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Легко. Не используйте глобальную среду.

myenv <- new.env()

with(myenv,
       {
         # Create 3 object variables.
         a <- 1
         b <- 2
         c <- 3
       }
       )
myenv$a
#[1] 1

# Create 3 functions.
myFunction1 <- function() {}
myFunction2 <- function() {}
myFunction3 <- function() {}

# Remove all from env.
# Keep the ones specified below.
rm(list = ls(envir = myenv)[! ls(envir = myenv) %in% c(
  "a",
  "c"
)
], envir = myenv
)

ls(envir = myenv)
#[1] "a" "c"
0 голосов
/ 09 января 2019

Я настоятельно рекомендую другой подход. Не удаляйте частично объекты, используйте правильную область видимости. То есть не определяйте объекты в глобальной среде, которые там не нужно определять, определяйте их внутри функций или вместо local областей.

Если пойти еще дальше, ваш functions.R файл также не должен определять функции в глобальной среде. Вместо этого, как предлагается в комментарии, он должен определять их в выделенной среде, которую вы можете attach, если это удобно. Это фактически то, что решают пакеты R. Если вы чувствуете, что пакеты R слишком тяжелы для вашей цели, я предлагаю вам использовать вместо этого мой механизм {modules} : он чисто реализует файловые модули кода.

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

Если вы действительно хотите получить чистую доску, перезапустите R и повторно запустите ваш скрипт: это единственный способ последовательно сбросить состояние сеанса R; все остальные способы являются хакерскими ошибками, поскольку они выполняют только частичную очистку.


Примечание о том, что вы написали:

При проверке функция удаляется, несмотря на то, что она начинается с точки.

Они не - они просто невидимы ; это то, что делает ведущая точка. Однако эта рекомендация также кажется мне плохой практикой: это ненужный взлом.

0 голосов
/ 09 января 2019

Вы можете использовать ls.str, чтобы указать mode объекта для поиска. При этом вы можете исключить функции из списка rm.

rm(list=setdiff(ls(),ls.str(mode="function")))
ls()
[1] "myFunction1" "myFunction2" "myFunction3"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...