Глобальная функция R для очистки рабочей области и хранилища дампа - PullRequest
0 голосов
/ 14 июля 2020

Я надеялся создать глобальную функцию, которая очистит мое рабочее пространство и сбросит память. Я назвал свою функцию «очистителем» и хочу, чтобы она выполнила следующий код:

remove(list = ls())
gc()

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

cleaner <- function(){
    remove(list = ls())
    gc()
    #I tried adding return(invisible()) to see if that helped but no luck
}

cleaner()

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

введите описание изображения здесь

1 Ответ

0 голосов
/ 14 июля 2020

Две мысли по этому поводу: ваш код не удаляет все объекты, чтобы также удалить скрытые, используйте

rm(list = ls(all.names = TRUE))

Также есть команда gctorture(), которая вызывает сборку мусора (почти ) каждое выделение памяти (как сказано на странице руководства). Он предназначен для разработчиков R, чтобы выявлять ошибки защиты памяти:

cleaner <- function(){
    # Turn it on
    gctorture(TRUE)

    # Clear workspace
    rm(list = ls(all.names = TRUE, envir=sys.frame(-1)),
       envir = sys.frame(-1))

    # Turn it off (important or it gets very slow)
    gctorture(FALSE)
}

Если эта процедура используется внутри функции, возникает следующая проблема: поскольку функция имеет свой собственный кадр стека, только объекты внутри этого кадр стека удаляется. Они все еще существуют снаружи. Поэтому необходимо отдельно указать с помощью sys.frame(-1), что следует учитывать только фрейм стека более высокого уровня. Затем переменные удаляются только внутри функции, которая вызывает cleaner(), и в самой cleaner при выходе из функции.

Но это также означает, что функция может быть вызвана только с верхнего уровня, чтобы работают правильно (вы можете использовать sys.frames(), в котором перечислены все фреймы стека более высокого уровня, чтобы создать что-то, что также позволяет избежать этой проблемы, если это действительно необходимо)

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