2 回答

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超9個(gè)贊
它們的關(guān)鍵是“代理模型”-您xa的存儲(chǔ)位置確實(shí)與原始對(duì)象相同,因此最終需要更改原始對(duì)象。
如果您不希望這樣做,則應(yīng)該做一件事:使用該clone()方法進(jìn)行(深度)復(fù)制,或者顯式創(chuàng)建一個(gè)新對(duì)象,將更改后的對(duì)象寫入該對(duì)象。方法二不能做到這一點(diǎn),您只需使用兩個(gè)名稱不同的變量,它們都是原始變量的“指針”(就代理模型而言)。
但是,當(dāng)您將int向量(從R)傳遞給NumericVector類型時(shí),隱式轉(zhuǎn)換和復(fù)制會(huì)帶來(lái)另外的復(fù)雜性:創(chuàng)建一個(gè)副本,然后不再更改原始副本。
這是一個(gè)更明確的示例,類似于我在教程或研討會(huì)中使用的示例:
library(inline)
f1 <- cxxfunction(signature(a="numeric"), plugin="Rcpp", body='
Rcpp::NumericVector xa(a);
int n = xa.size();
for(int i=0; i < n; i++) {
if(xa[i]<0) xa[i] = 0;
}
return xa;
')
f2 <- cxxfunction(signature(a="numeric"), plugin="Rcpp", body='
Rcpp::NumericVector xa(a);
int n = xa.size();
Rcpp::NumericVector xr(a); // still points to a
for(int i=0; i < n; i++) {
if(xr[i]<0) xr[i] = 0;
}
return xr;
')
p <- seq(-2,2)
print(class(p))
print(cbind(f1(p), p))
print(cbind(f2(p), p))
p <- as.numeric(seq(-2,2))
print(class(p))
print(cbind(f1(p), p))
print(cbind(f2(p), p))
這就是我所看到的:
edd@max:~/svn/rcpp/pkg$ r /tmp/ari.r
Loading required package: methods
[1] "integer"
p
[1,] 0 -2
[2,] 0 -1
[3,] 0 0
[4,] 1 1
[5,] 2 2
p
[1,] 0 -2
[2,] 0 -1
[3,] 0 0
[4,] 1 1
[5,] 2 2
[1] "numeric"
p
[1,] 0 0
[2,] 0 0
[3,] 0 0
[4,] 1 1
[5,] 2 2
p
[1,] 0 0
[2,] 0 0
[3,] 0 0
[4,] 1 1
[5,] 2 2
edd@max:~/svn/rcpp/pkg$
因此,無(wú)論是從int到float還是從float到float都是非常重要的。

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊
這很有趣。知道這一點(diǎn)的唯一方法是通過(guò)我猜想的調(diào)試器(或者您像Dirk一樣編寫程序包)。有沒(méi)有辦法將調(diào)試器附加到Rcpp函數(shù)?我正在考慮像Visual Studio調(diào)試器那樣附加dll的方法,然后單擊該dll即可進(jìn)入代碼。
- 2 回答
- 0 關(guān)注
- 687 瀏覽
添加回答
舉報(bào)