Вы действительно передаете объект и используете немного памяти. Но я не думаю, что вы можете сделать операцию над объектом в R, не передавая объект вокруг. Даже если вы не создали функцию и выполняли свои операции вне этой функции, R будет вести себя в основном одинаково.
Лучший способ убедиться в этом - создать пример. Если вы находитесь в Windows, откройте диспетчер задач Windows. Если вы работаете в Linux, откройте окно терминала и выполните команду top. Я собираюсь предположить 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 () работать? Вероятно, не так, как он будет запускаться автоматически по мере необходимости, я просто запустил его выше, чтобы показать, как это влияет на использование памяти.
Надеюсь, это поможет!