在C ++中调用R函数,传递参数

时间:2015-02-09 00:51:44

标签: c++ r rcpp

我试图调用R中的integrate()函数,并在我的c ++代码中使用它,因为如果编码我自己的数值积分方法,那么准确性不如R中的那么好。在Rcpp的帮助下,这是我的代码:

double den_cpp2 (NumericVector x, double theta){
int nx = x.size();
double val = 1;
for(int i=0;i<nx;i++){
  val = val * (2*x[i]/theta*(x[i]<=theta)+2*(1-x[i])/(1-theta)*(theta<x[i]));
}
return(val);
}
// [[Rcpp::export]]
NumericVector joint_cpp2 ( NumericVector theta,int n,NumericVector x, double a, double b){
int nt = theta.size();
//std::cout<<"nt = "<<nt<<"\n";
NumericVector val(nt);
//std::cout<<"val = "<<val<<"\n";
for (int j = 0; j < nt;j++){
  val[j] = den_cpp2(x,theta[j])*R::dbeta(theta[j],a,b,0);
}
return(val);
}

以上函数joint_cpp2是我尝试进行数值积分的原因。由于R中的integrate函数需要一个vetorized函数,所以我写了一个vetorized版本。 x是为计算den中的密度而生成的样本,b是具有给定值的参数。

// [[Rcpp::export]]
double callintegrate(Function f,double low, double up, int n, NumericVector x, 
                            double a, double b) {
    Function itgR("integrate");
    List res = itgR(f,low,up,n,x,a,b);
    //NumericVector res = f(x);
    return res["value"];
}

这是我在C ++中调用R函数的方法。 f是我想要积分的函数,low和up是区间界限,n,x,a,b是函数f中使用的参数。

所以,我用在R:

n=1000
theta=0.01
a=b=0.5
x=Sample_x(n,theta)## a given function to generate samples
callFunction(joint_cpp2,0,1,n,x,a,b)

在大多数情况下,这种方法运行得很快。但是,我遇到了诸如extremely bad integrand behaviour之类的问题。我可能应该将某些值传递给integrate函数。例如,rel.tol,相对容差。好吧,问题来了: 我试着用:

double callintegrate(Function f,double low, double up, int n, NumericVector x, 
                            double a, double b,double rel.tol) {
    Function itgR("integrate");
    List res = itgR(f,low,up,n,x,a,b,rel.tol);
    //NumericVector res = f(x);
    return res["value"];
}

将rel.tol的值传递给integrate。但是,C ++不接受rel.tol的名称样式。我可能,也许我可以忽略变量的名称,只需将其作为integrate中的正确位置插入即可。但是,我不知道正确的位置如下:

integrate(f, lower, upper, ..., subdivisions = 100L,
          rel.tol = .Machine$double.eps^0.25, abs.tol = rel.tol,
          stop.on.error = TRUE, keep.xy = FALSE, aux = NULL)

我在...中添加了f的加法变量值,那么如何判断rel.tol的位置。

任何人都可以帮我解决问题吗?它是由错误引起的:extremely bad integrand behaviour。我不知道如何处理它。当命名约定不同时,它会导致另一个问题,即如何将值传递给R函数。

0 个答案:

没有答案