Вы, действительно, передаете объект и используете некоторую память. Но я не думаю, что вы можете сделать операцию над объектом в R, не проходя вокруг объекта. Даже если вы не создали функцию и не выполняли свои операции вне функции, R будет вести себя в основном одинаково.
Лучший способ увидеть это - создать пример. Если вы находитесь в Windows, откройте диспетчер задач Windows. Если вы находитесь в Linux, откройте окно терминала и запустите верхнюю команду. В этом примере я предполагаю Windows. В R выполните следующее:
col1<-rnorm(1000000,0,1)
col2<-rnorm(1000000,1,2)
myframe<-data.frame(col1,col2)
rm(col1)
rm(col2)
gc()
это создает пару векторов, называемых col1 и col2 затем объединяет их в кадр данных, называемый myframe. Затем он отбрасывает векторы и заставляет мусорную корзину запускать. Посмотрите в своем диспетчере задач Windows при использовании mem для задачи Rgui.exe. Когда я запускаю R, он использует около 19 мегабайт памяти. После того, как я запускаю выше команды моя машина использует только под 35 мег для R.
Теперь попробуйте это:
myframe<-myframe+1
ваше использование памяти для R должно перейти к более 144 мег. Если вы выберете сборку мусора с помощью gc(), вы увидите, что она опустится примерно до 35 мегабайт. Для того, чтобы попробовать это с помощью функции, вы можете сделать следующее:
doSomething <- function(df) {
df<-df+1-1
return(df)
}
myframe<-doSomething(myframe)
при запуске кода выше, использование памяти будет прыгать до 160 мег или около того. Запуск gc() вернет его обратно до 35 мегабайт.
Так что же из всего этого? Ну, делать операцию вне функции не намного эффективнее (с точки зрения памяти), чем выполнять ее в функции. Сбор мусора очищает вещи до хорошего. Должны ли вы принудительно запускать gc()? Вероятно, не так, как он будет запускаться автоматически по мере необходимости, я просто использовал его выше, чтобы показать, как он влияет на использование памяти.
Я надеюсь, что это поможет!
Последующий вопрос: по завершении «doSomething» команда «rm (doSomething)» освободит объект для сбора мусора, не так ли? – bernie
Адам, да. Ты прав. –
, но имейте в виду, что в приведенном выше примере «doSomething» - это функция, а не данные, поэтому она не очень большая. –