【问题标题】:Rcpp function cannot be found by RR找不到Rcpp函数
【发布时间】:2018-05-16 17:09:15
【问题描述】:

我构建了一个Rpackage(称为myUtils),它使用cpp 文件,在RStudio 后面Hadley's manual。我的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 &amp; 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::,则两者都不会出现

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

我们将不胜感激。

【问题讨论】:

  • 我建议您向 Wickham 博士和/或他的错误站点提交错误报告。 RcppArmadillo 作品;把书移开,从我们提供、测试和记录的RcppArmadillo.package.skeleton() 开始。干杯。
  • 你当然还需要buildmyUtilsload它。您的问题不清楚您是否这样做。
  • 在测试该功能之前我做的最后一件事是 Build & Reload - 它在我的帖子中
  • 您有NAMESPACE 文件吗?同样,我们的骨架将为您提供一个工作示例。
  • 两者都是正确的。谢谢!

标签: r package rstudio rcpp devtools


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    德克说:

    手动或通过 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);
    }
    

    【讨论】:

    • 这适用于任何使用 .cpp 文件的 R 包吗?
    猜你喜欢
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 2019-07-08
    相关资源
    最近更新 更多