Rcpp将矢量复制到矢量

时间:2015-02-22 23:50:35

标签: vector copy rcpp

我是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的操作,或者我应该使用循环来执行此操作。

非常感谢!

2 个答案:

答案 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,Rcpp11Grp1 = import(Grp2) ; ,你可以这样做:

{{1}}

答案 1 :(得分:0)

当前发生的事情是指针的一个非常常见的错误。 Grp1和Grp2是指针,因此设置一个等于另一个意味着它们指向同一个数组(并且对一个数组的任何更改都会影响另一个数组)。一种解决方案是使用迭代器一次一个地复制所有值。这可以通过弹出所有值清空一个IntegerVector,然后将其他IntegerVector中的所有元素推入清空的IntegerVector来完成。