使用 Rcpp 函数将 NULL 值作为符号地址传递

NULL value passed as symbol address with Rcpp functions

如果这个问题很愚蠢,我深表歉意,因为我是 Rcpp 的新手。我已经从 Rcpp 构建了一个包,但是当我安装它时,我发现所有与 Rcpp 相关的函数都会 return 以下类型的错误消息: .Call(, 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") 而不是使用包,它们会很好。

非常感谢!

您的包结构中的某些内容可能在这里被隐藏了,我们无法确定是什么。 @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
> 

我把所有相关文件here.