使用 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 关于名称空间的评论也很好。
以下是一些一般性评论:
不要同时使用两个 #include
文件,只使用 #include <RcppArmadillo.h>
在一个包中,不要使用[[Rcpp::depends("RcppArmadillo")]]
从头开始:
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.
如果这个问题很愚蠢,我深表歉意,因为我是 Rcpp 的新手。我已经从 Rcpp 构建了一个包,但是当我安装它时,我发现所有与 Rcpp 相关的函数都会 return 以下类型的错误消息:
.Call(
这是一个例子:
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 关于名称空间的评论也很好。
以下是一些一般性评论:
不要同时使用两个
#include
文件,只使用#include <RcppArmadillo.h>
在一个包中,不要使用
[[Rcpp::depends("RcppArmadillo")]]
从头开始:
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.