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

Rcpp:与代理模型不一致的行为,r,rcpp,R,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); } // [[Rcpp::export]] Numeri

本文讨论了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);
}
// [[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;
}
我们得到:

> temp = c(2,2,2,2)
> test_size(temp)
[1] 2 2 2 2
所以问题在于,前一篇文章和这篇文章说,在本例中,
test2
应该是一个指向
R
中底层
SEXP
对象的指针。但是,当我们分配
test2=test3
时,这不适用于
test
,因为
test
数值向量保持不变

已更新

我添加了一个例子,我认为这个作业并没有像德克建议的那样有效,但我当然可能误解了这个问题

假设我有以下函数:

// [[Rcpp::export]]
void test_size(NumericVector test){
  NumericVector test2(test);
  NumericVector test3 = NumericVector::create(1,1,1,1,1);
  test2 = test3;
  Rf_PrintValue(test);
}
// [[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;
}
/[[Rcpp::export]]
数字向量测试(){
数值矩阵mat(3,3);
材料行(0)=数值向量::创建(1,1,1);
材料行(1)=数值向量::创建(1,1,1);
材料行(2)=数值向量::创建(2,2,2);
数字向量检验;
数字向量测试2;
对于(int i=0;i

该函数应该输出
1,1,1
,但它会输出
2,2,2
。然而,当我用
test2=clone(test)
替换
test2=test
时,我得到了正确的输出。所以我想知道为什么我会有这种行为,即使这只是德克建议的作业?

当你看到下面修改过的程序中的所有三个时,我会变得更容易:

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> 
代码(现在已完成)的位置

#包括
使用名称空间Rcpp;
//[[Rcpp::导出]]
列出测试向量(数值向量测试){
数字向量测试2(测试);
NumericVector test3=NumericVector::create(1,1,1,1,1);
test2=test3;
返回列表::创建(命名为(“测试”)=测试,
命名为(“test2”)=test2,
命名(“test3”)=test3);
}
/***R
testvecs(c(2,2,2,2))
*/
因此:

  • 测试
    是传入的且未更改的,结果并不令人惊讶
  • test2
    被创建,然后被覆盖
  • test3
    是新创建的,并按预期进行了发布
  • test2
    被指定为与
    test3
    相同,并且是

我看这里没有不一致的地方。

但是
test2
指向
test
,所以我希望当
test2
被修改时,那么
test
也会被修改。
test2[1]=42
会做你期望的事情,但是你的
test2=test3
撤消先前创建的
test2
。这就是作业的工作原理。谢谢你的回复,但我在作业方面仍然有问题。请参阅我的更新问题,了解我遇到的问题的新示例。只是一个友好的提醒,提醒我更新了问题。我真的很想了解这里发生了什么。再次谢谢,先生。