2 回答
TA贡献1853条经验 获得超9个赞
它们的关键是“代理模型”-您xa的存储位置确实与原始对象相同,因此最终需要更改原始对象。
如果您不希望这样做,则应该做一件事:使用该clone()方法进行(深度)复制,或者显式创建一个新对象,将更改后的对象写入该对象。方法二不能做到这一点,您只需使用两个名称不同的变量,它们都是原始变量的“指针”(就代理模型而言)。
但是,当您将int向量(从R)传递给NumericVector类型时,隐式转换和复制会带来另外的复杂性:创建一个副本,然后不再更改原始副本。
这是一个更明确的示例,类似于我在教程或研讨会中使用的示例:
library(inline)
f1 <- cxxfunction(signature(a="numeric"), plugin="Rcpp", body='
Rcpp::NumericVector xa(a);
int n = xa.size();
for(int i=0; i < n; i++) {
if(xa[i]<0) xa[i] = 0;
}
return xa;
')
f2 <- cxxfunction(signature(a="numeric"), plugin="Rcpp", body='
Rcpp::NumericVector xa(a);
int n = xa.size();
Rcpp::NumericVector xr(a); // still points to a
for(int i=0; i < n; i++) {
if(xr[i]<0) xr[i] = 0;
}
return xr;
')
p <- seq(-2,2)
print(class(p))
print(cbind(f1(p), p))
print(cbind(f2(p), p))
p <- as.numeric(seq(-2,2))
print(class(p))
print(cbind(f1(p), p))
print(cbind(f2(p), p))
这就是我所看到的:
edd@max:~/svn/rcpp/pkg$ r /tmp/ari.r
Loading required package: methods
[1] "integer"
p
[1,] 0 -2
[2,] 0 -1
[3,] 0 0
[4,] 1 1
[5,] 2 2
p
[1,] 0 -2
[2,] 0 -1
[3,] 0 0
[4,] 1 1
[5,] 2 2
[1] "numeric"
p
[1,] 0 0
[2,] 0 0
[3,] 0 0
[4,] 1 1
[5,] 2 2
p
[1,] 0 0
[2,] 0 0
[3,] 0 0
[4,] 1 1
[5,] 2 2
edd@max:~/svn/rcpp/pkg$
因此,无论是从int到float还是从float到float都是非常重要的。
TA贡献1859条经验 获得超6个赞
这很有趣。知道这一点的唯一方法是通过我猜想的调试器(或者您像Dirk一样编写程序包)。有没有办法将调试器附加到Rcpp函数?我正在考虑像Visual Studio调试器那样附加dll的方法,然后单击该dll即可进入代码。
- 2 回答
- 0 关注
- 661 浏览
添加回答
举报