Утечки памяти в R при использовании оператора ~

#r

#r

Вопрос:

Я следую примерам из http://adv-r.had.co.nz/memory.html . В одном из примеров предлагается функция следующего вида (после загрузки пакета pryr):

 f2 <- function() {
  x <- 1:1e6
  z ~ x
}
mem_change(y <- f2())
object_size(y)
 

в этом случае я вижу, что память не освобождается, потому что значение mem_change включает пространство памяти вектора x.

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

 f3 <- function() {
  x <- 1:1e6
  z ~ x
  rm(x)
}
mem_change(y <- f3())
object_size(y)
 

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

Спасибо

Комментарии:

1. На этой странице также указано, что «двумя основными причинами утечек памяти являются формулы и замыкания, поскольку они оба захватывают окружающую среду» . Во втором примере среда была x удалена, поэтому видимый размер должен измениться. Что касается «правильного пути»… точно не уверен. Возврат формулы — это не то, что я делаю часто (хорошо… вообще ), и я не знаю многих пакетов, которые возвращают формулы. Хороший вопрос.

2. спасибо за ваш комментарий, это то, чего я не понимаю, что такое «среда», которую, как я полагаю, создает «~»?

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