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



我是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值,但没有,输入没有任何问题。我不知道如何解决这个问题,也不知道是什么原因导致了这个错误。

提前感谢的任何响应

我遇到了同样的问题。我不是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++的肤浅了解,它可能与内存分配有关,并且每次源代码时,都会释放内存,因此不会出现错误分配。但我认为这是一个非常疯狂的猜测。最佳

最新更新