当我们使用Rcpp时,我很困惑如何将参数传递到cppFunction中。特别是,我想知道是否有人能解释以下代码的结果。
library(Rcpp)
cppFunction("void test(double &x, NumericVector y) {
x = 2016;
y[0] = 2016;
}")
a = 1L
b = 1L
c = 1
d = 1
test(a,b)
test(c,d)
cat(a,b,c,d) #this prints "1 1 1 2016"
发布于 2016-12-11 01:02:29
如前所述,Rcpp围绕R的SEXP
对象建立了方便的类。
double
类型没有默认的SEXP
对象。这是因为在R中,没有标量这样的东西。因此,新内存被分配,使得&
引用不兼容。因此,修改的变量范围仅限于函数,并且从未对结果进行更新。因此,对于这两个测试用例,您将看到1
。integer
,所以提供的对象类型为L
,这与C++函数所期望的numeric
类型相冲突。当L
作为对象实例化为numeric
时,这个问题就会得到解决。因此,不需要创建具有正确类型的中间内存位置才能接收值。因此,第二种情况下的修改能够传播回R。例如:
a = 1L
class(a)
# "integer"
a = 1
class(a)
# "numeric"
https://stackoverflow.com/questions/41083921
复制相似问题