nal*_*zok 2 c++ r syntactic-sugar rcpp
考虑一个虚拟的例子
> cppFunction('
+ NumericVector invert(NumericVector& x) {
+ x = x + 1;
+ return x;
+ }')
> invert(1:3)
[1] 2 3 4
Run Code Online (Sandbox Code Playgroud)
Rcpp糖很方便,但是效率很低,因为它创建了一个新对象并分配了该对象,而不是就地修改原始对象。x += 1;凭直觉,我尝试执行,但Rcpp抱怨
错误:没有可行的重载'+ ='
如何使用Rcpp糖进行原位修饰?
您的假设是错误的-没有进行复制[1]。因此,只需就地执行:
R> library(Rcpp)
R> cppFunction("void inplaceMod(NumericVector x) { x = x + 1; }")
R> x <- as.numeric(1:5)
R> inplaceMod(x)
R> x
[1] 2 3 4 5 6
R>
Run Code Online (Sandbox Code Playgroud)
所以对于你的问题:
如何使用Rcpp糖进行原位修饰?
答案是“按原样使用”,但要注意您的对象类型。如果这样做,则可以通过直接和无缝访问R对象存储器来提供最有效的访问。
[1]一个已知且有案可查的警告是发生无声演员。上面的方法不起作用,1:5因为那些整数像我们NumericVector在函数签名中一样先复制到数字。有关此内容的更多信息,请参见Rcpp FAQ,问题5.1和其他地方。
| 归档时间: |
|
| 查看次数: |
53 次 |
| 最近记录: |