Две мысли по этому поводу: ваш код не удаляет все объекты, чтобы также удалить скрытые, используйте
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()
, в котором перечислены все фреймы стека более высокого уровня, чтобы создать что-то, что также позволяет избежать этой проблемы, если это действительно необходимо)