R 找不到 Rcpp 函数

Rcpp function cannot be found by R

我在 Hadley's manual 之后的 RStudio 中构建了一个 R package(称为 myUtils),它使用 cpp 文件。我的 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 成功完成,并在 R 目录中创建了 RccpExports.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::

时都不会出现

我好像漏掉了什么,但我不知道是什么。

不胜感激。

Rcpp 属性机制本身不会向 NAMESPACE 文件中的导出指令添加功能。我们的示例使用通配符来导出所有内容。

因此,如果您的功能不可见,请执行其中一项或两项操作

  • 通过 ::: 调用,即 myUtils:::eigenMatMult(A, A)
  • eigenMatMult 添加到导出中,手动或通过 roxygen 标签

德克说:

add eigenMatMult to exports, either by hand or via a roxygen tag

如果是由 roxygen2 生成的,我们可能不想手动修改 NAMESPACE:

# 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);
}