我想知道在R中是否可以创建一个改变数据集并且不将其作为值返回的函数。原因主要是因为我担心在非常大的数据集上存在时间问题。为了具体 - 我有一个类型
的功能f <- function(data, ...) {
add several columns to data
return(data)
}
这意味着我需要致电
data <- f(data, ...)
更新数据集。相反,我想打电话
f(data)
更新(添加列)我的数据集。
我有两个问题:
1)我的假设是我现在使用的方法对于非常大的数据集需要很长时间吗? (或者R会以某种方式看到,我刚刚添加了列?)
2)有没有办法修改功能来做我提出的建议?
提前致谢!
答案 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包。