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

标签 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 值,但没有任何值,输入没有任何问题。
我不知道如何解决此问题以及导致此错误的原因。

提前感谢您的任何回复

最佳答案

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

关于Rcpp 错误 Null 值作为符号地址传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53603861/

相关文章:

r - 如何按行创建 R 数据框

r - 在 R 中,计算字符串向量中的表达式

rcpp - 将 Rcpp::Nullable 与 RcppArmadillo 类型一起使用时出错

c++ - Rcpp map /字典/列表

database - 将 .RData 文件序列化到数据库

r - 在矩阵中查找子矩阵

javascript - 如何在 R highcharter 中制作 3 级钻取图(可能有其他包)

r - fatal error : RcppEigen. h:没有这样的文件或目录

r - compileAttributes 不会将本地 header 复制到 RcppExports.cpp

c++ - 将 c++ 对象作为指针传递给 Rcpp 中另一个函数的重用