2012-08-01 59 views
2

當使用大型對象播放通過按值的存儲器和速度的影響可能很大。如果參數未被修改,R編譯器是否通過引用傳遞?

R具有several ways通過按引用:

  • 引用類
  • R.oo
  • 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 
+0

依吾答案是[前面的問題](http://stackoverflow.com/questions/2603184/r-pass-by-reference):環境。如果這不能回答你的問題,你是否可以重新說明/重新確定問題的重點,以明確除參考類和其他OO方法以外的其他方法以及環境 - 您認爲是否允許? – 2012-08-01 03:05:09

+0

在寫出一個更清晰的例子時,我意識到R已經做了優化,因爲它不會複製未修改的對象。投票關閉/刪除。我知道這並不是我想到的那種現象。蛋,見面。 – 2012-08-01 11:18:21

+0

我覺得我們應該把它開到了旁邊的人想知道這提供另一個目標是提高你的問題很好。 – 2012-08-01 11:33:55

回答

1

這可能是大錯特錯了你所需要的,但關於封閉包裝的對象是什麼?此功能使得它知道給它的父對象,這裏我用的小volcano做一個非常簡單的工作的功能。

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


fun <- mkFun(volcano) 

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

現在fun可以避開通過了由工人功能,因爲它喜歡做的工作。

相關問題