R函数更改数据集 - 而不是返回它

时间:2014-01-30 10:10:33

标签: r function

我想知道在R中是否可以创建一个改变数据集并且不将其作为值返回的函数。原因主要是因为我担心在非常大的数据集上存在时间问题。为了具体 - 我有一个类型

的功能
f <- function(data, ...) {
  add several columns to data
  return(data)
}

这意味着我需要致电

data <- f(data, ...)

更新数据集。相反,我想打电话

f(data)

更新(添加列)我的数据集。

我有两个问题:

1)我的假设是我现在使用的方法对于非常大的数据集需要很长时间吗? (或者R会以某种方式看到,我刚刚添加了列?)

2)有没有办法修改功能来做我提出的建议?

提前致谢!

3 个答案:

答案 0 :(得分:2)

关于你的第一个问题:试试吧。我将在下面给出一个示例,但使用您自己的代码和您自己的数据集进行测试。

library(MASS)

data <- as.data.frame(mvrnorm(1E6, mu=rep(0, 20), Sigma=diag(1:20)))
data2 <- data

add_columns <- function(data) {
  data$X <- rnorm(1E6)
  data$y <- rnorm(1E6)
  data
}

使用函数调用进行测试:

> system.time({
+   data <- add_columns(data)
+ })
   user  system elapsed 
  0.567   0.000   0.568 
> system.time({
+   data <- add_columns(data)
+ })
   user  system elapsed 
  0.711   0.128   0.839 

没有函数调用:

> system.time({
+   data2$X <- rnorm(1E6)
+   data2$y <- rnorm(1E6)
+ })
   user  system elapsed 
  0.650   0.020   0.669 
> system.time({
+   data2$X <- rnorm(1E6)
+   data2$y <- rnorm(1E6)
+ })
   user  system elapsed 
  0.589   0.024   0.613 

函数调用稍微慢一些(可能),但差异很小,以至于我不愿意开始搞乱全局分配或环境。

答案 1 :(得分:0)

据我所知和你的问题中的dickoa评论,data.table应该已经这样做了:检查?data.table,然后搜索链接“帮助页面:=”。这将解释如何通过引用进行分配与data.table一起使用。

答案 2 :(得分:-1)

您可以在R中通过引用传递,但这很难。请参阅http://www.stat.berkeley.edu/~paciorek/computingTips/Pointers_passing_reference_.html或R.oo包。