实际上,您正在传递对象并使用一些内存。但我不认为你可以在不传递对象的情况下对 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 任务管理器中查看 Rgui.exe 任务的内存使用情况。当我启动 R 时,它使用大约 19 兆内存。运行上述命令后,我的机器对 R 的使用量不到 35 兆。
现在试试这个:
myframe<-myframe+1
您对 R 的内存使用量应该超过 144 兆。如果您使用 gc() 强制垃圾收集,您将看到它回落到大约 35 兆。要使用函数尝试此操作,您可以执行以下操作:
doSomething <- function(df) {
df<-df+1-1
return(df)
}
myframe<-doSomething(myframe)
当您运行上面的代码时,内存使用量将跃升至 160 兆左右。运行 gc() 会将其降回 35 兆。
那么如何看待这一切呢?好吧,在函数之外执行操作(就内存而言)并不比在函数中执行操作更有效。垃圾收集清理东西真的很好。你应该强制 gc() 运行吗?可能不会因为它会根据需要自动运行,我只是在上面运行它以显示它如何影响内存使用。
我希望这会有所帮助!