如何将C ++对象(double *)作为SEXP返回给R?

时间:2018-02-16 16:49:12

标签: c++ r

我必须编写一个线性回归程序并使用R调用它。 这是我的代码。它无法将theta作为SEXP返回。

SEXP reg(Rcpp::NumericVector  x,Rcpp::NumericVector  y){
    int i,n1,n2;
    n1=x.size();
    n2=y.size();
    if(n1!=n2)
        cout<<"Error";
    else{
        double wx[n1], wy[n1];
        for(i=0;i<n1;i++){
            wx[i]=x[i];
            wy[i]=y[i];
        }
        int iterations=1500;
        //default learning rate;
        double alpha=0.01;
        double *theta = new double[2];
        double *J = new double[iterations];
        theta = gradient_descent(wx,wy, alpha, iterations, J, n1,theta);
        return(theta);
    }
}

它出错:无法转换&#39; double *&#39;到了SEXP&#39;作为回报。 我想要一些解决方案。

1 个答案:

答案 0 :(得分:0)

你的功能不合适。尝试下风(未经测试):

SEXP reg(Rcpp::NumericVector  x,Rcpp::NumericVector  y){
    int i,n1,n2;
    SEXP out = PROTECT(allocVector(REALSXP, 2));
    n1=x.size();
    n2=y.size();
    if(n1!=n2)
        cout<<"Error";
    else{
        double wx[n1], wy[n1];
        for(i=0;i<n1;i++){
            wx[i]=x[i];
            wy[i]=y[i];
        }
        int iterations=1500;
        //default learning rate;
        double alpha=0.01;
        double *theta = REAL(out);
        double *J = new double[iterations];
        theta = gradient_descent(wx,wy, alpha, iterations, J, n1,theta);
    }
    UNPROTECT(1);
    return(out);
}

我不知道您的函数gradient_descent以及谁应该关心释放J指向的资源。别忘了释放它。

非常好的有用手册在这里http://adv-r.had.co.nz/C-interface.html