2015-05-20 44 views
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,因爲testNumericVector保持不變。

更新

我加入了一個例子,我想分配未正常工作德克建議,但我當然可以被誤解的問題。

因此,假設我有以下功能:

// [[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時,我得到正確的輸出。所以我想知道爲什麼我會得到這種行爲,即使這只是德克建議的分配?

回答

2

,當你在所有這三個如下修改後的程序我變得更容易:

R> testvecs(c(2,2,2,2)) 
$test 
[1] 2 2 2 2 

$test2 
[1] 1 1 1 1 1 

$test3 
[1] 1 1 1 1 1 

R> 

其中(已完成)的代碼是

#include <Rcpp.h> 
using namespace Rcpp; 
// [[Rcpp::export]] 
List testvecs(NumericVector test){ 
    NumericVector test2(test); 
    NumericVector test3 = NumericVector::create(1,1,1,1,1); 
    test2 = test3; 
    return List::create(Named("test") = test, 
         Named("test2") = test2, 
         Named("test3") = test3); 
} 

/*** R 
testvecs(c(2,2,2,2)) 
*/ 

所以:

  • test傳入並保持不變,結果不出人意料
  • test2創建和然後覆蓋
  • test3是剛創建的,並配備了預期
  • test2被分配到相同的test3,它是。

我在這裏看到沒有不一致。

+0

但'test2'指向'test',所以我希望當'test2'被修改時,'test'也會被修改。 – kolonel

+0

'test2 [1] = 42'會做你期望的事情,但你的'test2 = test3;'撤銷之前創建'test2'。這就是分配的工作原理。 –

+0

感謝您的回覆,但我仍然遇到任務問題。請查看我更新的問題,以查看我遇到的問題的新示例。 – kolonel