【问题标题】:Reference object from environment without assignment从没有赋值的环境中引用对象
【发布时间】:2014-09-19 15:21:38
【问题描述】:

我有一个看起来像这样的函数:

sampleFcn <- function(c1, c2) {
  chars <- get('chars', envir=.GlobalEnv)
  if (c1 %in% chars) { 
    array[c1,1] <<- array[c1,1] + 1
    if (c2 %in% chars)  bigM[c1,c2] <<- bigM[c1,c2] + 1
  }
}

这将应用于大型数据集。就像现在一样,它可以工作,但需要很长时间才能应用,我猜这主要是因为第二行,我不断地将一个新变量分配给一个新变量,一个大向量(字符)。我的问题是,我如何调用全局变量 'chars' 而不必经常使用新内存来为它分配 'get' 函数?

【问题讨论】:

    标签: r memory-management


    【解决方案1】:

    我会重新考虑您对代码效率低下的假设:

    library(pryr)
    x <- matrix(1:1e6,10)
    > object_size(x)
    4 MB
    
    track_x <- track_copy(x)
    
    foo <- function(){
        r1 <- mem_change(s <- get("x",.GlobalEnv))
        r2 <- mem_change(2 %in% s)
        list(r1,r2)
    }
    
    > foo() #No noticeable memory use
    [[1]]
    14 kB
    
    [[2]]
    1.74 kB
    
    
    > track_x()
    # Nothing changed
    
    > mem_changed(x[1,1] <- x[1,1]+1)
    4MB #Increased by 4MB
    
    > track_x()
    x copied #Because it copied
    

    【讨论】:

    • 谢谢!所以每次我将矩阵元素增加 1 时,整个矩阵都会重新分配给内存?你知道解决办法吗?
    • @Bridgeburners R 如何决定何时需要创建副本以及何时通过引用进行操作很复杂。所以我会回避说 R 会在您增加单个值时复制一个矩阵每次。但是使用&lt;- 修改对象通常会成为复制的来源。我会研究 data.table 包,它允许通过引用创建和修改列。
    • 谢谢,很有帮助!
    猜你喜欢
    • 2017-09-23
    • 2021-03-16
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    相关资源
    最近更新 更多