2015-12-09 49 views
1

這可能是一個非常基本的要求,但我有R A RCPP函數計算,我想回傳給R.各種矩陣我的代碼如下所示:如何將多個對象從Rcpp返回給R?

zeromatrix <- matrix(0,6,1) 
east <- matrix(seq(1:48),6,8) 
west <- matrix(seq(1:48),6,8) 
func <- 'NumericMatrix eastC(NumericMatrix e, NumericMatrix w, NumericMatrix zeromatrix) { 
int ecoln=e.ncol(); 
int ecolnlessone = ecoln - 1; 
NumericMatrix eout(e.nrow(),e.ncol()) ; 
for (int j = 0;j < ecoln;j++) { 
if (j > 0) { 
eout(_,j) = e(_,j-1); 
} else { 
eout(_,j) = e(_,0); 
} 
} 
eout(_,0) = zeromatrix(_,0); 
return eout; 

NumericMatrix wout(w.nrow(),w.ncol()) ; 
for (int j = 0;j < ecoln;j++) { 
if (j < ecolnlessone) { 
wout(_,j) = w(_,j+1); 
} else { 
wout(_,j) = w(_,j); 
} 
} 
wout(_,ecolnlessone) = zeromatrix(_,0); 
return wout; 
}' 
cppFunction(func) 

d <- eastC(east, west, zeromatrix) 

兩個我都想要「EOUT」和'wout'被傳回給R,但顯然只有最後返回的值被傳回(即wout)。所以d變成wout。我如何提取多個對象(即在此情況下爲eout和wout)?我在Dirk的介紹中看到了Rcpp,它有一些關於list(ret)的內容,但是當我嘗試這個時,我的代碼不能編譯。任何幫助將非常感激?

+0

見我只是鏈接到的問題,你想'RCPP ::表::創建()'和在呼叫分配你的對象。 –

+0

謝謝。但是任何我嘗試使用::(例如Rcpp :: List :: create())都會失敗。我正在使用革命R.我很想讓犰狳包工作,但儘管加載圖書館沒有你的例子工作。我不確定是否因爲我沒有正確安裝RTools。我需要犰狳提供的代數工具。下面的答案似乎回答我的問題,但。謝謝。 – user2901667

回答

3

如何消除雙方return語句,並添加:

List ret; 
ret["eout"] = eout; 
ret["wout"] = wout; 
return ret;` 

和變化的eastC返回類型List

所以,結果應該是這樣的:

zeromatrix <- matrix(0,6,1) 
east <- matrix(seq(1:48),6,8) 
west <- matrix(seq(1:48),6,8) 
func <- 'List eastC(NumericMatrix e, NumericMatrix w, NumericMatrix zeromatrix) { 
int ecoln=e.ncol(); 
int ecolnlessone = ecoln - 1; 
NumericMatrix eout(e.nrow(),e.ncol()) ; 
for (int j = 0;j < ecoln;j++) { 
if (j > 0) { 
eout(_,j) = e(_,j-1); 
} else { 
eout(_,j) = e(_,0); 
} 
} 
eout(_,0) = zeromatrix(_,0); 

NumericMatrix wout(w.nrow(),w.ncol()) ; 
for (int j = 0;j < ecoln;j++) { 
if (j < ecolnlessone) { 
wout(_,j) = w(_,j+1); 
} else { 
wout(_,j) = w(_,j); 
} 
} 
wout(_,ecolnlessone) = zeromatrix(_,0); 
List ret; 
ret["eout"] = eout; 
ret["wout"] = wout; 
return ret; 
}' 
cppFunction(func) 

d <- eastC(east, west, zeromatrix) 
+0

是的,工作正常。我認爲我可以通過使用d $ eout來引用我需要的特定矩陣。 – user2901667

+1

您希望List :: create提高效率。 –