2016-12-11 30 views
0

我對使用Rcpp時如何將參數傳入cppFunction感到困惑。特別是,我想知道是否有人可以解釋下面的代碼的結果。如何將參數傳入cppFunction

library(Rcpp) 
cppFunction("void test(double &x, NumericVector y) { 
    x = 2016; 
    y[0] = 2016; 
}") 
a = 1L 
b = 1L 
c = 1 
d = 1 
test(a,b) 
test(c,d) 
cat(a,b,c,d) #this prints "1 1 1 2016" 

回答

3

如同在其他領域如前所述,RCPP建立各地的r SEXP對象便捷類。

  • 對於第一個參數,double類型沒有默認的SEXP對象。這是因爲在R中,沒有像標量這樣的東西。因此,分配新內存使得&引用不兼容。因此,修改的變量範圍僅限於該函數,並且從不會更新結果。因此,對於這兩個測試用例,您將看到1
  • 對於第二種情況,對象類之間存在不匹配。在提供的第一個調用對象中,由於L末尾附加了integer類型,這與預期類型的​​C++函數numeric相沖突。當對象被實例化爲numeric時,一旦L被刪除,問題就得以解決。因此,需要創建中間存儲器位置而不是,該存儲器位置的類型才能接收該值。因此,第二種情況下的修改能夠傳播回R

例如

a = 1L 
class(a) 
# "integer" 
a = 1 
class(a) 
# "numeric" 
+0

謝謝!所以沒有int,double,char有默認的SEXP對象,對吧?順便說一句,通過價值和參考傳遞NumericVector有沒有區別? – Gauchy10

+1

@ Gauchy10,正確。另外,'NumericVector'實際上是一個指針,因此,添加'&'只是視覺上的糖。 – coatless

+0

非常感謝! – Gauchy10