r - 有没有办法将 ALTREP 与 Rcpp 一起使用?
问题描述
例子:
// [[Rcpp::export]]
size_t z1(SEXP x) {
return Rf_xlength(x);
}
// [[Rcpp::export]]
size_t z2(NumericVector x) {
// do anything or nothing
return 1;
}
回复:
x <- seq(1,1e10)
z1(x)
[1] 1e+10
z2(x)
# computer hard crash
假设作为示例,我只想获取 ALTREP 向量的前 10 个元素。在 C++ 中这样做的最佳方法是什么?
解决方案
Rcpp 当前不支持 ALTREP。因此,从 ALTREPSEXP
到的转换NumericVector
将实现它。在我的情况下,R 停止告诉我它不能分配所需的内存,但这是一个很小的区别。
现在,您必须在没有 Rcpp 细节的情况下处理 ALTREP 对象,例如对于您的最后一个问题:
#include <Rcpp.h>
// [[Rcpp::export]]
SEXP get_region(SEXP x, R_xlen_t i, R_xlen_t n) {
SEXP result;
switch (TYPEOF(x)) {
case INTSXP: {
result = PROTECT(Rf_allocVector(INTSXP, n));
INTEGER_GET_REGION(x, i, n, INTEGER(result));
UNPROTECT(1);
break;
}
case REALSXP: {
result = PROTECT(Rf_allocVector(REALSXP, n));
REAL_GET_REGION(x, i, n, REAL(result));
UNPROTECT(1);
break;
}
default: {
Rcpp::stop("Invalid SEXPTYPE %d (%s).\n", TYPEOF(x), Rcpp::type2name(x));
}
}
return result;
}
/*** R
x <- seq(1,1e10)
.Internal(inspect(x)) # @5623ba0b65f0 14 REALSXP g0c0 [NAM(3)] 1 : 10000000000 (compact)
get_region(x, 0, 10) # [1] 1 2 3 4 5 6 7 8 9 10
x <- seq(1,1e9)
.Internal(inspect(x)) # @5623ba143ff0 13 INTSXP g0c0 [NAM(3)] 1 : 1000000000 (compact)
get_region(x, 0, 10) # [1] 1 2 3 4 5 6 7 8 9 10
*/
这使用来自http://gallery.rcpp.org/articles/rcpp-wrap-and-recurse/的运行时多态性。
推荐阅读
- php - 发布数据时隐藏网址
- go - How to read from os.Stdin repeatedly without shared bufio.Scanner
- windows - 使用 Windows Installer 取消 Windows 服务安装/卸载会导致服务安装/卸载不完整
- javascript - Changing a div opacity on scroll
- python - Python Selenium: Getting dynamic content within iframe
- python - Opening Firefox with selenium error
- php - php jquery mysql - 在循环中的另一个加载更多中加载更多按钮
- d3.js - D3 力导向图(v4)不接受 img 作为节点
- java - 返回 ArrayList 大小不起作用
- ruby-on-rails - Why does strong params order in Rails matter?