我构建了一个R
package
(称为myUtils
),它使用cpp
文件,位于RStudio
之后cpp
。我的src
文件位于devtools::use_rcpp()
目录中,在运行后创建:R
,在我的myUtils.R
目录下我有一个名为#' myUtils: A package with various functions for my analyses
#'
#'
#' @docType package
#' @name myUtils
#' @useDynLib myUtils
#' @importFrom Rcpp sourceCpp
NULL
的文件,这些行:
cpp
这是我的// [[Rcpp::depends(RcppArmadillo, RcppEigen)]]
#include <RcppArmadillo.h>
#include <RcppEigen.h>
using namespace Rcpp;
// [[Rcpp::export]]
SEXP armaMatMult(arma::mat A, arma::mat B){
arma::mat C = A * B;
return Rcpp::wrap(C);
}
// [[Rcpp::export]]
SEXP eigenMatMult(Eigen::MatrixXd A, Eigen::MatrixXd B){
Eigen::MatrixXd C = A * B;
return Rcpp::wrap(C);
}
文件:
devtools::document()
然后我运行useDynLib(myUtils)
,将NAMESPACE
添加到Build & Reload
文件中。然后我运行RccpExports.R
,成功完成,并在R
目录中创建了cpp
文件,其中包含eigenMatMult <- function(A, B) {
.Call('_myUtils_eigenMatMult', PACKAGE = 'myUtils', A, B)
}
个函数,例如:
eigenMatMult
然后我尝试测试set.seed(1)
A <- matrix(rnorm(100), 10, 10)
> eigenMatMult(A=A,B=A)
Error: could not find function "eigenMatMult"
,但它无法识别:
myUtils::
并且在{{1}}
之前都没有出现看起来我错过了一些东西,但我无法弄清楚它是什么。
帮助将不胜感激。
答案 0 :(得分:6)
Rcpp Attributes机制本身不会向NAMESPACE
文件中的export指令添加函数。我们的示例使用通配符导出所有内容。
因此,如果您的功能不可见,请执行
中的一项或两项:::
致电myUtils:::eigenMatMult(A, A)
eigenMatMult
添加到导出答案 1 :(得分:0)
德克说:
通过手工或通过roxygen标签向出口中添加
eigenMatMult
如果NAMESPACE
是由roxygen2生成的,我们可能不想手工修改:
# Generated by roxygen2: do not edit by hand
因此,让我们为roxygen2添加一个标记,以便它知道将我们的功能自动添加到NAMESPACE
文件中。
您的代码示例如下:
// [[Rcpp::export]]
SEXP eigenMatMult(Eigen::MatrixXd A, Eigen::MatrixXd B){
Eigen::MatrixXd C = A * B;
return Rcpp::wrap(C);
}
它应该看起来像这样(注意带有//' @export
的行):
//' @export
// [[Rcpp::export]]
SEXP eigenMatMult(Eigen::MatrixXd A, Eigen::MatrixXd B){
Eigen::MatrixXd C = A * B;
return Rcpp::wrap(C);
}