Значение NULL передается как адрес символа с функциями Rcpp

Прошу прощения, если этот вопрос довольно глупый, поскольку я новичок в Rcpp. Я создал пакет из Rcpp, но когда я его установил, я обнаружил, что все функции, связанные с Rcpp, будут возвращать следующий тип сообщения об ошибке: Ошибка в .Call (‹указатель: 0x0›, M): значение NULL, переданное как адрес символа

Вот пример:

getEigenValue.cpp

#include <RcppArmadillo.h>
#include <Rcpp.h>

// [[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)
}

ОПИСАНИЕ

Depends: Rcpp
LinkingTo: Rcpp, RcppArmadillo

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

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


person Amber Chen    schedule 01.01.2021    source источник
comment
Как выглядит ваш NAMESPACE   -  person Joseph Wood    schedule 01.01.2021
comment
@JosephWood useDynLib (mmds, .registration = TRUE) importFrom (Rcpp, evalCpp) exportPattern (^ [[: alpha:]] +)   -  person Amber Chen    schedule 01.01.2021


Ответы (1)


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

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

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

  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)))  # same as ?eigen
     [,1]
[1,]    0
[2,]    2
> 

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

person Dirk Eddelbuettel    schedule 01.01.2021
comment
Спасибо за комментарии! Я попробовал их и обнаружил, что все работает один раз, но после того, как я изменил несколько примеров, я снова получил это сообщение об ошибке. - person Amber Chen; 02.01.2021
comment
Вы должны делать что-то особенное на своей стороне, чтобы, возможно, затенять и скрыть рабочую версию с нерабочей. Может быть, перестать работать в сочетании sourceCpp() и работы с пакетами и просто обновить пакет - только предположение. - person Dirk Eddelbuettel; 02.01.2021
comment
Я попробую, спасибо! - person Amber Chen; 02.01.2021
comment
@AmberChen, если бы вы могли создать публичное репо, это было бы намного проще. Кроме того, как много раз говорит Дирк, просмотрите обильные пакеты на CRAN, чтобы получить больше рекомендаций. - person Joseph Wood; 02.01.2021
comment
@AmberChen Спасибо, что приняли ответ. Вы выяснили, почему ваша поездка была более неровной, чем должна была быть? Какие-нибудь советы мы должны задокументировать? - person Dirk Eddelbuettel; 02.01.2021
comment
Прошу прощения, что я до сих пор не понимаю, почему это произошло, но кажется, что чистая рабочая среда может помочь. Еще раз спасибо! - person Amber Chen; 03.01.2021