我是Rcpp和C ++编码的新手,所以请原谅我提出基本问题。代码的cpp部分是
// test.cpp
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
void testRun() {
IntegerVector Grp1 = IntegerVector::create(1,2,3,4);
IntegerVector Grp2 = IntegerVector::create(3,4,5,6);
Rf_PrintValue(Grp1);
Grp1 = Grp2;
Rf_PrintValue(Grp1);
Grp2[3] = Grp2[3]+1;
Rf_PrintValue(Grp1);
}
当我运行testrun()时,我得到了输出
> Rcpp::sourceCpp('test.cpp')
> testRun()
[1] 1 2 3 4
[1] 3 4 5 6
[1] 3 4 5 7
当我在Gr2
中将Gr1
分配给Gr1 = Gr2
时,在分配后更改Gr2
中的元素也会更改Gr1
中的值。是否有一个IntegerVectors函数可以执行类似Gr1 = copy of Gr2
的操作,或者我应该使用循环来执行此操作。
非常感谢!
答案 0 :(得分:6)
正如评论中暗示的那样,你可以使用
Grp1 = clone(Grp2) ;
但是这将创建一个新的R对象,然后将其分配给Grp1
,因此您需要支付一些内存分配,并丢弃一些本可以使用的内存,即更多的垃圾收集器工作。
您也可以使用Grp1
std::copy( Grp2.begin(), Grp2.end(), Grp1.begin() ) ;
中的现有内存
sapply
另一种可能超越顶部的方法是使用auto identity = [](double x){ return x; } ;
Grp1 = sapply( Grp2, identity );
。像这样:
Rcpp
但鉴于identity
不是std::copy,您可能需要在函数外定义inline double identity(double x){
return x ;
}
才能使此方法可用。
Rcpp14
FWIW,Rcpp11
或Grp1 = import(Grp2) ;
,你可以这样做:
{{1}}
答案 1 :(得分:0)
当前发生的事情是指针的一个非常常见的错误。 Grp1和Grp2是指针,因此设置一个等于另一个意味着它们指向同一个数组(并且对一个数组的任何更改都会影响另一个数组)。一种解决方案是使用迭代器一次一个地复制所有值。这可以通过弹出所有值清空一个IntegerVector,然后将其他IntegerVector中的所有元素推入清空的IntegerVector来完成。