2

在玩大型对象时,按值传递对内存和速度的影响可能很大。

R 有几种传递引用的方法:

  • 参考类
  • C/C++/其他外部语言
  • 环境

但是,它们中的许多都需要相当大的开销(在代码复杂性和程序员时间方面)。

特别是,我正在设想类似你可以在 C++ 中使用常量引用的东西:传递一个大对象,在不修改的情况下对其进行计算,然后返回该计算的结果。

由于 R 没有常量的概念,我怀疑如果这种情况发生在任何地方,它是在编译的 R 函数中,编译器可以看到形式参数在代码中的任何地方都没有被修改并通过引用传递它。

如果未修改参数,R 编译器是否会按引用传递?如果没有,这样做是否存在任何技术障碍,还是尚未实施?


示例代码:

n <- 10^7
bigdf <- data.frame( x=runif(n), y=rnorm(n), z=rt(n,5) )
myfunc <- function(dat) invisible(with( dat, x^2+mean(y)+sqrt(exp(z)) ))
library(compiler)
mycomp <- compile(myfunc)
tracemem(bigdf)
> myfunc(bigdf)
> # No object was copied!  Question is not necessary
4

1 回答 1

1

This may be way off base for what you need, but what about wrapping the object in a closure? This function makes a function that knows about the object given to its parent, here I use the tiny volcano to do a very simple job.

mkFun <- function(x) {
    function(rownumbers) {
    rowSums(x[rownumbers , , drop = FALSE])
    }
}


fun <- mkFun(volcano)

fun(2)  ##1] 6493
fun(2:3)  ##[1] 6493 6626

Now fun can get passed around by worker functions to do its job as it likes.

于 2012-08-01T04:40:04.370 回答