Rcpp:与代理模型不一致的行为
本文讨论了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::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
。这就是作业的工作原理。谢谢你的回复,但我在作业方面仍然有问题。请参阅我的更新问题,了解我遇到的问题的新示例。只是一个友好的提醒,提醒我更新了问题。我真的很想了解这里发生了什么。再次谢谢,先生。