这个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建议的任务?
答案 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
相同,而且是。我认为这里没有不一致。