rcpp 函数未在 r 包中导出

Tay*_*lor 3 export r package rcpp

当我尝试从 R 包中加载一些 C++ 函数时,在尝试导出一些 C++ 函数时遇到了一些麻烦。运行devtools::check()收益率

> checking R code for possible problems ... NOTE
  postRiverComp: no visible binding for global variable
    ‘_thmc_postRiverComp’
  preFlopComp: no visible binding for global variable ‘_thmc_preFlopComp’
  preRiverComp: no visible binding for global variable
    ‘_thmc_preRiverComp’
  preTurnComp: no visible binding for global variable ‘_thmc_preTurnComp’
  rcpp_hello_world: no visible binding for global variable
    ‘_thmc_rcpp_hello_world’
  Undefined global functions or variables:
    _thmc_postRiverComp _thmc_preFlopComp _thmc_preRiverComp
    _thmc_preTurnComp _thmc_rcpp_hello_world
Run Code Online (Sandbox Code Playgroud)

我认为我在编写 Roxygen 注释方面做得很好,所以我一定是在使用它们的地方使用了错误的函数。需要明确的是,我可以library(thmc)并且不会抛出任何错误,但不会导出任何函数。我可以看到这一点,因为当我输入search()它时会产生

 [1] ".GlobalEnv"        "package:thmc"      "devtools_shims"    "tools:rstudio"     "package:stats"    
 [6] "package:graphics"  "package:grDevices" "package:utils"     "package:datasets"  "package:methods"  
[11] "Autoloads"         "org:r-lib"         "package:base" 
Run Code Online (Sandbox Code Playgroud)

这是我的src/do_comps.cpp文件:

#include <Rcpp.h>
#include "easy_header.h"

using namespace Rcpp;


//' Calculate pre-flop probability estimates
//' 
//' @param your_cards your cards as a length-4 character vector.
//' @param num_sims number of simulations.
//' @param num_folders number of folders.
//' @param num_oppo number of opponents.
//' @export
// [[Rcpp::export]]
CharacterVector preFlopComp(CharacterVector your_cards, IntegerVector num_sims, IntegerVector num_folders,
                            IntegerVector num_oppo) {

  unsigned int _num_folders = num_folders[0];
  unsigned int _num_sims = num_sims[0];
  unsigned int _num_oppo = num_oppo[0];
  std::string val1 = Rcpp::as<std::string>(your_cards[0]);
  std::string suit1 = Rcpp::as<std::string>(your_cards[1]);
  std::string val2 = Rcpp::as<std::string>(your_cards[2]);
  std::string suit2 = Rcpp::as<std::string>(your_cards[3]);

  double percWon, percTie;

  // construct simulator object and add folders  
  Simulator s(_num_sims, _num_oppo); 
  for(size_t i = 0; i < _num_folders; ++i)
    s.addFolder();

  // add your cards
  s.addYouCard(Card::fromString(val1, suit1));
  s.addYouCard(Card::fromString(val2, suit2));

  // get final numbers
  s.doSim(percWon, percTie);

  return CharacterVector::create(s.prettyResults());
}
Run Code Online (Sandbox Code Playgroud)

请注意,文档文件中有两行带有“export”一词。在R/RcppExports.R我有

# Generated by using Rcpp::compileAttributes() -> do not edit by hand
# Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393

#' Calculate pre-flop probability estimates
#' 
#' @param your_cards your cards as a length-4 character vector.
#' @param num_sims number of simulations.
#' @param num_folders number of folders.
#' @param num_oppo number of opponents.
#' @export
preFlopComp <- function(your_cards, num_sims, num_folders, num_oppo) {
    .Call(`_thmc_preFlopComp`, your_cards, num_sims, num_folders, num_oppo)
}
Run Code Online (Sandbox Code Playgroud)

也许这是我的NAMESPACE文件。我已经为这些尝试了一些东西。最近的尝试是使用我在这里这里找到的建议:

# Generated by roxygen2: do not edit by hand

importFrom(Rcpp, sourceCpp)
useDynLib(thmc, .registration=TRUE)
export(postRiverComp)
export(preFlopComp)
export(preRiverComp)
export(preTurnComp)
Run Code Online (Sandbox Code Playgroud)

devtools::check()但是,通过删除importFromuseDynLib调用,运行确实会更改此文件。我也尝试exportPattern("^[[:alpha:]]+")按照官方小插图中的建议添加该行,但没有用。

另外,我觉得我已经检查通过这些答案给所有的箱子在这里,依然无果。

Ral*_*ner 6

importFromuseDynLib在电话NAMESPACE是很重要的。切换到手动创建的NAMESPACE文件或添加

#' @useDynLib thmc, .registration = TRUE
#' @importFrom Rcpp evalCpp
Run Code Online (Sandbox Code Playgroud)

到您的roxygen2代码。这里有 R 注释,因为我通常会使用thmc-package.R它。您也可以do_comps.cpp在使用 C++-comments 时将其放入。

  • @Taylor 对我来说,`R CMD build` 加上 `R CMD check` 以及 `devtools::check` 会产生 2 个警告和 1 个注释,并且没有错误。安装该包以及之后附加它都可以。请注意,通过“源”按钮调用的“Rcpp::sourceCpp”对于属于包一部分的文件来说是不可行的检查。 (2认同)
  • 如果有人遇到这个线程,在 C++ 代码中的 `// [[Rcpp::export]]` 之前添加 `//' @export` 也很重要,这样 C++ 函数可以通过 ` 添加到命名空间中roxygen2` 并在包外可用(如果这是您想要的)。如果您只需要从包 `// [[Rcpp::export]]` 中您自己的 R 函数中调用 C++ 函数就足够了。 (2认同)