0
此post討論了Rcpp中參數傳遞的代理模型的一些問題。然而,當我實現了這個功能:Rcpp:與代理模型的行爲不一致
// [[Rcpp::export]]
void test_size(NumericVector test){
NumericVector test2(test);
NumericVector test3 = NumericVector::create(1,1,1,1,1);
test2 = test3;
Rf_PrintValue(test);
}
我們得到:
> temp = c(2,2,2,2)
> test_size(temp)
[1] 2 2 2 2
所以問題是,以前的帖子,這book說,在這種情況下test2
應該是一個指向底層SEXP
來自R
的對象。但是,當我們分配test2 = test3
時,這不適用於test
,因爲test
NumericVector
保持不變。
更新
我加入了一個例子,我想分配未正常工作德克建議,但我當然可以被誤解的問題。
因此,假設我有以下功能:
// [[Rcpp::export]]
NumericVector testing(){
NumericMatrix mat(3,3);
mat.row(0) = NumericVector::create(1,1,1);
mat.row(1) = NumericVector::create(1,1,1);
mat.row(2) = NumericVector::create(2,2,2);
NumericVector test;
NumericVector test2;
for (int i = 0; i < mat.nrow(); i++){
test = mat.row(i);
if (test[0] == 1){
test2 = test;
}
}
return test2;
}
這個功能應該輸出1,1,1
,而是它輸出2,2,2
。但是,當我用test2 = clone(test)
替換test2 = test
時,我得到正確的輸出。所以我想知道爲什麼我會得到這種行爲,即使這只是德克建議的分配?
但'test2'指向'test',所以我希望當'test2'被修改時,'test'也會被修改。 – kolonel
'test2 [1] = 42'會做你期望的事情,但你的'test2 = test3;'撤銷之前創建'test2'。這就是分配的工作原理。 –
感謝您的回覆,但我仍然遇到任務問題。請查看我更新的問題,以查看我遇到的問題的新示例。 – kolonel