2015-01-14 48 views
5

我正在寫一些代碼在RcppEigen,我在documentation過這個不祥的警告是:可以修改RcppEigen中的映射矩陣嗎?

一絕,當然要小心,不要修改C++代碼將R對象的內容。推薦的做法是始終將映射對象聲明爲const。

這涉及「映射」矩陣,即特徵中與相應的R對象使用相同存儲器的矩陣。

這個警告是關於良好的函數式編程實踐,還是有其他的事情,如果我使用映射對象做就地修改會出錯?


這是一個簡化版本我在做什麼在RCPP:

#include <RcppEigen.h> 
// [[Rcpp::depends(RcppEigen)]] 

// [[Rcpp::export]] 
void modify(Eigen::Map<Eigen::MatrixXd> X) { 

    X(0,0) = 0; 
    return; 
} 

哪個做這樣的事情在R:

X <- matrix(1:4, 2) + 0 
X 
#  [,1] [,2] 
# [1,] 1 3 
# [2,] 2 4 
modify(X) 
X 
#  [,1] [,2] 
# [1,] 0 3 
# [2,] 2 4 

對於特定的問題,我通過修改我的矩陣,我得到了5倍的速度提升,所以我爲在可讀性和可維護性方面的小犧牲做好了準備。據我所知,它可以按照預期工作,但我擔心在未來某個時候我會引入某種微妙的錯誤。

回答

9

如果您仍然知道R中變量的副作用,那麼修改是完全可以的。

在一個純粹的功能世界中,您不希望產生副作用:輸入被處理並且未被更改,結果被返回。

這裏我們有一個更混合的方法。對象從R向下傳遞爲SEXP,P代表指針---所以更改仍然存在。這讓一些人感到困惑,我們有時必須在這裏解釋如何避免它。 :)

但總之你是安全的,特別是如果只是設置元素且並不做瘋狂的東西,如改變尺寸等頁。

+0

這是如此之快,如此不會讓我接受另外10回答分鐘。謝謝! – pete

+5

幸運的時機。我只是坐下來寫一些其他Rcpp相關的代碼,刷新,看到你的問題,並試圖有幫助;-) –