c++ - 使用 Rcpp 糖就地修改 SEXP
问题描述
考虑一个虚拟示例
> cppFunction('
+ NumericVector invert(NumericVector& x) {
+ x = x + 1;
+ return x;
+ }')
> invert(1:3)
[1] 2 3 4
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>
所以对于你的问题:
如何使用 Rcpp 糖执行就地修改?
答案是“按原样使用”,但要注意您的对象类型。如果你这样做了,那么最有效的访问可能是通过对 R 对象内存的直接和无缝访问来提供。
[1] 一个已知并记录在案的警告是何时发生无声演员表。上面的内容不起作用,1:5
因为这些整数首先被复制到 numeric,就像我们NumericVector
在函数签名中一样。有关此问题的更多信息,请参阅Rcpp FAQ、问题 5.1和其他地方。
推荐阅读
- ssis - SSIS 错误:无法解密受保护的 XML 节点
- angular - ngModel 在与 formControlName 相同的表单字段上。支持使用反应形式的 ngModel 输入属性和 ngModelChange 事件已弃用
- javascript - 从文件导入着色器时出现编译错误。三.js + Vue.js + WebPack
- asp.net-mvc - 如何在 WebApi 中为注销操作创建 URL
- java - 基于内容的textview动态渐变背景
- javascript - 触发事件兄弟继承javascript odontogram
- git - 从 Visual Studio 2017 将项目推送到 DevOps
- c++ - 考虑到每次遍历的路径都相同,如何在不使用邻接列表的情况下在 C++ 中实现有向图?
- python - 如何将列表列表中的所有数字变成整数
- sql - 我想从两个表中选择 [job_id]、[name]、[enabled] 和 [run_status] 列