代码之家  ›  专栏  ›  技术社区  ›  adn bps

在函数中修改变量的高效内存方法

  •  1
  • adn bps  · 技术社区  · 6 年前

    问题

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

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

    因为 十、 非常大,我想“就地”修改它,即不创建副本。然而,我的理解是,在R中,函数是“修改时复制”换句话说,如果我修改 十、 在功能范围内 F ,R将复制 十、

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

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

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

    问题

    然而,SO上的人对将全局变量传递到R中的函数非常消极。有些人甚至因为问这个问题而被否决。

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   Katia    6 年前

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

    Pass an object to a function without copying it on change

    第二种方法并不能真正解决问题。下面是我使用mem\u 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