我一般都不熟悉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的功能,或者我应该使用循环来执行此操作?

非常感谢!

最佳答案

如评论中所提示,您可以使用

Grp1 = clone(Grp2) ;

但这将创建一个新的R对象,然后将其分配给Grp1,因此您需要支付一些内存分配,并丢弃一些本可以使用的内存,即,为该行的垃圾收集器做更多的工作。

您也可以只使用std::copy重用Grp1中的现有内存
std::copy( Grp2.begin(), Grp2.end(), Grp1.begin() ) ;

也许最重要的另一种方法是使用sapply。像这样:
auto identity = [](double x){ return x; } ;
Grp1 = sapply( Grp2, identity );

但是鉴于Rcpp并非sapply over lambdas,您可能必须在函数外定义identity,此方法才能使用。
inline double identity(double x){
    return x ;
}

FWIW,使用Rcpp14Rcpp11,您可以简单地执行以下操作:
Grp1 = import(Grp2) ;

07-24 09:52