r使用rcpp时中止

时间:2019-02-09 17:52:55

标签: r rcpp

我正在编写一些代码,并且在运行时中止了。 r版本是3.5.1。我认为我的rcpp代码有问题,但是我找不到它。它只是显示R会话已中止。

################我认为这部分没有任何问题。
E/BONUSPACK: OSRMRoadManager::getRoad: request failed.
# #################这部分可能有问题。
#include <Rcpp.h>

Rcpp::LogicalVector logical_index(Rcpp::IntegerVector idx, R_xlen_t n) {
  bool invert = false; 
  Rcpp::LogicalVector result(n, false);

  for (R_xlen_t i = 0; i < idx.size(); i++) {
    if (!invert && idx[i] < 0) invert = true;
    result[std::abs(idx[i])] = true;
  }

  if (!invert) return result;
  return !result;
}


// [[Rcpp::export]]
Rcpp::NumericVector 
  Subset(Rcpp::NumericVector x, Rcpp::IntegerVector idx) {
    return x[logical_index(idx, x.size())];
  }

combnPrim用于查找向量的所有组合,并输出矩阵,而Subset与vector [-i]的用法相同。单独地,所有函数都可以在cppFunction中发挥良好的作用,但是当这样放置它们时,事情就会出错。

1 个答案:

答案 0 :(得分:1)

由于此代码非常复杂,因此我不会寻找确切的特定错误。但是,我可以确认@RalfStubner是正确的,您的问题是您正在尝试访问不存在的向量的元素。

如果将logical_index()更改为

LogicalVector logical_index(IntegerVector idx, R_xlen_t n) {
    bool invert = false;
    LogicalVector result(n, false);

    for (R_xlen_t i = 0; i < idx.size(); i++) {
        if (!invert && idx(i) < 0) invert = true;
        result(std::abs(idx(i))) = true;
    }

    if (!invert) return result;
    return !result;
}

因此通过()而不是[]进行元素访问以确保边界检查, 1 而不是仅仅中止,我看到了以下内容:

r_test(a,comp, fct, tempf, combnPrim, Fv, vec, Subset)
  

r_test(a,comp,fct,tempf,compnPrim,Fv,vec,Subset)中的错误:
    评估错误:索引超出范围:[索引= 10; scope = 8] ..

这意味着您正在尝试访问不存在的vector的元素。我还可以告诉您发生这种情况的基本原因:在logical_vector()中,当idx的元素大于n时,就会发生这种情况。因此,在r_test()的某个时刻,您正在使用Subset()调用idx,而该元素的元素大于x.size()


1是正确的,当用 子向量对子向量进行子集替换时,尝试使用()进行向量子集设置会出错。但是,这在访问向量的一个元素时有效。