Прошу прощения, если вопрос довольно глупый, так как я новичок в Rcpp. Я собрал пакет из Rcpp, но когда я установил его, я обнаружил, что все функции, связанные с Rcpp, возвращают сообщение об ошибке следующего типа: Error in .Call(, M) : NULL value passed as symbol address

Здесь приведен пример:

getEigenValue.cpp

#include 
#include 

// [[Rcpp::depends("RcppArmadillo")]]
// [[Rcpp::export]]

arma::vec getEigenValue(arma::mat M) {
  arma::vec eigval;
  arma::mat eigvec;
  
  eig_sym(eigval, eigvec, M);
  return eigval;
};

RcppExports.cpp

// getEigenValue
arma::vec getEigenValue(arma::mat M);
RcppExport SEXP _mypackage_getEigenValue(SEXP MSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< arma::mat >::type M(MSEXP);
    rcpp_result_gen = Rcpp::wrap(getEigenValue(M));
    return rcpp_result_gen;
END_RCPP
}

RcppExports.R

getEigenValue <- function(M) {
    .Call(`_mypackage_getEigenValue`, M)
}

ОПИСАНИЕ

Зависит от: Rcpp
LinkingTo: Rcpp, RcppArmadillo

Все функции Rcpp имеют такую ошибку, но они будут в порядке, если я просто использую sourceCpp("./src/getEigenValue.cpp") вместо использования пакета.

Большое спасибо!

Ответы (1)

Что-то в структуре вашего пакета может быть foobar'ed здесь, и мы не можем сказать, что именно. Комментарий @Joseph о пространстве имен тоже хорош.

Вот несколько общих комментариев:

  1. Не используйте оба файла #include, используйте только #include

  2. В пакете не используйте [[Rcpp::depends("RcppArmadillo")]]]

  3. Начните с чистого листа:

    3.1 Запустите RcppArmadillo.package.skeleton("mypackage")
    3.2 Скопируйте ваш файл в src/
    3.3 Повторно запустите compileAttributes()
    3.4 Соберите пакет

Этот процесс работает для меня:

> library("mypackage")
> getEigenValue(cbind(c(1,-1), c(-1,1))))  # то же самое, что и ?eigen
     [,1]
[1,] 0
[2,] 2
>

Я поместил все соответствующие файлы здесь.

2022 WebDevInsider