问题
我想写一个修改大矩阵的每一列的函数, 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中做这样的事情的最佳方式是什么?
答案 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