我一般都不熟悉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,使用
Rcpp14
或Rcpp11
,您可以简单地执行以下操作:Grp1 = import(Grp2) ;