2017-12-02 372 views
2

找到我建立一个Rpackage(称为myUtils),它使用一个文件cpp,在RStudio以下Hadley's manual。我cpp文件驻留在src目录,运行后创建:devtools::use_rcpp(),我R目录下我有一个名为myUtils.R文件,用这些行:RCPP功能不能由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

我建议你向Wickham博士和/或他的bug网站提交错误报告。 RcppArmadillo的作品;将本书移开,从我们提供的RcppArmadillo.package.skeleton()开始,测试和记录。干杯。 –

+0

当然,你还需要_build_包'myUtils'和_load_它。你的问题不清楚你是否做过。 –

+0

我测试功能之前做的最后一件事是构建与刷新 - 这是在我的岗位 – dan

回答

5

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

所以,如果你的函数是不可见的,做

  • 通话的一方或双方通过:::myUtils:::eigenMatMult(A, A)
  • 添加eigenMatMult出口,手工或通过roxygen标签