内存有效的方法来修改函数内的变量

时间:2018-05-01 22:31:19

标签: r memory memory-management global

问题

我想写一个修改大矩阵的每一列的函数, x

f = function(x){
    # do something to x
    # return x
}

因为 x 非常大,我想修改它"就位#34;即不创建副本。但是,我的理解是,在R中,函数是"复制修改。"换句话说,如果我在函数 f 中修改 x ,R将复制 x

建议的解决方案(更新:不起作用!有关详细信息,请参阅下面的答案。

因此,似乎最好的解决方案是修改全局变量,即

f = function(x){
    x = deparse(substitute(x))
    x = get(x, envir = globalenv())
    # do something to x
}

问题

然而,SO上的人对将全局变量传递给R中的函数非常不利。有些人甚至仅仅因为询问它而被投票。

我的问题是:在R中做这样的事情的最佳方式是什么?

1 个答案:

答案 0 :(得分:2)

这个问题已经在这里讨论了:

Pass an object to a function without copying it on change

你的第二种方法并没有真正解决问题。这是我使用mem_used()

的结果运行的测试
library(pryr)
mem_used()
#41.3 MB

x <- matrix(1:1000000000, ncol=1000)
mem_used()
#4.04GB


f2<- function(x){
  print(mem_used())
  x = deparse(substitute(x))
  print(mem_used())
  x = get(x, envir = globalenv())
  x<- x+1
  print(mem_used())
  x
}

x <- f2(x)
#4.04 GB
#4.04 GB
#12 GB
mem_used()
#8.04GB