Для вызова функции из данного пакета используйте RcppArmadillo (R cpp) - PullRequest
0 голосов
/ 28 января 2020

Я учусь использовать RcppArmadillo (R cpp), чтобы код работал быстрее. На практике я обычно сталкиваюсь с тем, что хочу вызвать некоторые функции из заданных пакетов. Ниже приведен небольшой пример. Я хочу рассчитать пороги лассо (или scad, mcp). В R мы можем использовать функцию thresh_est в library(HSDiC), которая читает

library(HSDiC) # acquire the thresh_est() function
# usage: thresh_est(z, lambda, tau, a = 3, penalty = c("MCP", "SCAD", "lasso"))
# help: ?thresh_est

z = seq(-5,5,length=500)
thresh = thresh_est(z,lambda=1,tau=1,penalty="lasso")
# thresh = thresh_est(z,lambda=1,tau=1,a=3,penalty="MCP")
# thresh = thresh_est(z,lambda=1,tau=1,a=3.7,penalty="SCAD")
plot(z,thresh)

Затем я пытаюсь реализовать вышеизложенное через RcppArmadillo (R cpp). Согласно ответам teuder , а также без пальто и без пальто , я пишу код (который сохраняется как thresh_arma. cpp) ниже:

#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]

using namespace Rcpp; //with this, Rcpp::Function can be Function for short, etc.
using namespace arma;  // with this, arma::vec can be vec for short, etc.
// using namespace std; //std::string

// [[Rcpp::export]]
vec thresh_arma(vec z, double lambda, double a=3, double tau=1, std::string penalty) {
    // Obtaining namespace of the package
    Environment pkg = namespace_env("HSDiC");
    // Environment HSDiC("package:HSDiC");

    // Picking up the function from the package
    Function f = pkg["thresh_est"];
    // Function f = HSDiC["thresh_est"];

    vec thresh;
    //  In R: thresh_est(z, lambda, tau, a = 3, penalty = c("MCP", "SCAD", "lasso"))
    if (penalty == "lasso") {
        thresh = f(_["z"]=z,_["lambda"]=lambda,_["a"]=a,_["tau"]=tau,_["penalty"]="lasso");
    } else if (penalty == "scad") {
        thresh = f(_["z"]=z,_["lambda"]=lambda,_["a"]=a,_["tau"]=tau,_["penalty"]="SCAD");
    } else if (penalty == "mcp") {
        thresh = f(_["z"]=z,_["lambda"]=lambda,_["a"]=a,_["tau"]=tau,_["penalty"]="MCP");
}
return thresh;
}

Затем я выполняю компиляцию как

library(Rcpp)
library(RcppArmadillo)
sourceCpp("thresh_arma.cpp")

# z = seq(-5,5,length=500)
# thresh = thresh_arma(z,lambda=1,tau=1,penalty="lasso")
# # thresh = thresh_arma(z,lambda=1,a=3,tau=1,penalty="mcp")
# # thresh = thresh_arma(z,lambda=1,a=3.7,tau=1,penalty="scad")
# plot(z,thresh)

Однако компиляция не удалась, и я не имею представления о причинах.

...