Rcpp错误Null值作为符号地址传递

时间:2018-12-04 00:12:38

标签: r rcpp

我是Rcpp的新手。

我创建了一个rcpp函数,该函数将具有2列的数据框和一个向量作为输入,并返回一个向量。 我的数据如下

set.seed(10)
min= sort(rnorm(1000,800,sd=0.1))
max= min+0.02
k=data.frame(min,max)
explist= sort(rnorm(100,800,sd=0.2))

然后我叫cfilter.cpp

k$output <- cfilter(k,explist)

#include <Rcpp.h> 
using namespace Rcpp;
// [[Rcpp::export]]
CharacterVector cfilter(DataFrame k, NumericVector explist) {

  NumericVector col1 = k["min"];
  NumericVector col2 = k["max"];
  NumericVector exp = explist ;

  int n = col1.size();
  int j = 0;
  CharacterVector out(n);

  for (int i=0; i<n ; i++){
    out[i]=NA_STRING;

    while(exp[j]<= col2[i]){

        if( exp[j]>= col1[i] && exp[j]<= col2[i] ){
          out[i]="Y";
          break;
        }
        else if(exp[j]>col2[i]){

          break;
        }
        else {
          j++ ;
        }
    }

  }
 return out;
}

在我调用它的16171次后,它运行得很好。然后突然,在循环16172中,它因错误而停止:

> myfile$output<- cfilter(k,explist2)
Error in .Call(<pointer: (nil)>, k, explist) : 
  NULL value passed as symbol address

我检查了k和explist的NA值,但是没有,输入没有任何问题。 我不知道如何解决此问题以及导致此错误的原因。

预先感谢您的回复

2 个答案:

答案 0 :(得分:0)

有时我会遇到相同的问题,Rcpp函数指针突然变为空且没有明显的模式,因此很难复制该问题。它可以通过重新编译函数来解决,但是我看不到关于指针变为空的押韵或原因。特别是在长时间运行的会话中。 (我的版本是0.12.17)

答案 1 :(得分:0)

我遇到了同样的问题。我既不是Rcpp专家,也不是C ++,也不是后端编码专家。 每当我要调用该函数时,我都通过重新打包cpp文件来解决此问题。因此,例如,如果以下是您的for循环:

for(i in 1:SampleSize){
   out[[I]]<-cfilter(k,explist)
 }

执行以下操作:

for(i in 1:SampleSize){
   sourceCpp("cfilter.cpp")
   out[[i]]<-cfilter(k,explist)
}

同样,我不知道为什么这对我有用,但确实有用。根据我对C ++的浅浅了解,它可能与内存分配有关,并且每次您获取资源时,都会释放内存,因此不会发生错误分配。但是我认为这是一个非常疯狂的猜测。 最好的