避免传递数据框的最佳方法是什么?

时间:2009-02-27 21:49:18

标签: r dataframe

我有12个data.frame可以使用。它们是相似的,我必须对每个进行相同的处理,所以我写了一个函数,它接受data.frame,处理它,然后返回data.frame。这有效。但我担心我会绕过一个非常大的结构。我可能正在制作临时副本(是吗?)这样做效率不高。避免传递data.frame的最佳方法是什么?

doSomething <- function(df) {
  // do something with the data frame, df
  return(df)
}

3 个答案:

答案 0 :(得分:10)

你确实是在传递物体并使用一些记忆。但我不认为你可以对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任务的mem用法。当我开始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 meg。

那么这一切是怎么回事?好吧,在函数之外进行操作并不比在函数中执行操作更有效(就内存而言)。垃圾收集清理真的很好。你应该强制gc()运行吗?可能不是因为它会根据需要自动运行,我只是在上面运行它以显示它如何影响内存使用情况。

我希望有所帮助!

答案 1 :(得分:9)

我不是R专家,但大多数语言都使用大对象的引用计数方案。在修改对象的副本之前,不会创建对象数据的副本。如果您的函数只读取数据(即用于分析),则不应复制。

答案 2 :(得分:0)

我遇到了这个问题,寻找其他东西,而且它已经过时了 - 所以我现在只提供一个简短的答案(如果你想要更多的解释,请发表评论)。

您可以传递R中的环境,其中包含从1到所有变量的任何位置。但是你可能不需要担心它。

[你也可以用类做类似的事情。我目前只了解如何使用类来实现多态函数 - 并且注意到有超过1个类系统可以使用。]