Rcpp:代理模型的行为不一致

时间:2015-05-20 08:28:56

标签: r rcpp

这个post讨论了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保持不变。

更新

我正在添加一个例子,我认为作业不像Dirk建议的那样有效,但当然我可能会误解这个问题。

假设我有以下功能:

// [[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 = test替换test2 = clone(test)时,我得到了正确的输出。所以我想知道为什么我会得到这种行为,即使这只是Dirk建议的任务?

1 个答案:

答案 0 :(得分: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相同,而且是。

我认为这里没有不一致。