在R中传递大对象的内存有效方法

Ale*_*lex 3 scope r function global-variables environment-variables

我有一个函数需要访问其父环境中的变量(调用该函数的范围).变量在内存方面很大,所以我不希望将值传递给被调用的函数.除了在全局范围内声明变量之外,还有一种标准的方法吗?例如:

g <- function (a, b) { #do stuff}

f <- function(x) {
    y <- 3 #but in my program y is very large
    g(x, y)
}
Run Code Online (Sandbox Code Playgroud)

我想访问y in g().所以像这样:

g <- function (a) { a+y }

f <- function(x) {
    y <- 3 #but in my program y is very large
    g(x)
}
Run Code Online (Sandbox Code Playgroud)

这可能吗?

谢谢

42-*_*42- 7

"在全局范围内声明变量"没有任何优势,在R中甚至可能不可能取决于你的意思.你当然可以使用第二种形式.导致对象的重复副本甚至三重副本的操作是赋值.您需要更详细地描述您要通过代码说明的内容:y <- 3.在仅仅访问位于封闭框架中的名为"y"的对象的函数内通常不需要这样做.

在声明的环境中存储变量有时会提高访问效率,但我的理解是效率是因为使用了哈希表而提高了速度.一个访问环境中的项目的方式与访问列表元素的方式相同:

> evn <- new.env()
> evn$a <- rnorm(100000)
> ls(evn)
[1] "a"
> length(evn$a)
[1] 100000
Run Code Online (Sandbox Code Playgroud)

BigMemory项目可能为此提供便利:http: //www.bigmemory.org/.它和Lumley的biglm可能有助于评论中提到的大数据集.

  • 但它会创建一个残差矢量和另一个长度为30密耳的线性预测器.有时人们会通过使用lm.fit来获得性能,但在其他情况下,可能需要对一些数据进行采样.`subset`函数可以很好地完成. (2认同)