当我尝试从R包中加载某些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
我认为我在写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"
这是我的
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()); }
[请注意,在文档文件中有两行带有单词“ 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)
}
# Generated by roxygen2: do not edit by hand importFrom(Rcpp, sourceCpp) useDynLib(thmc, .registration=TRUE) export(postRiverComp) export(preFlopComp) export(preRiverComp) export(preTurnComp)
运行
devtools::check()
确实会通过删除importFrom
和useDynLib
调用来更改此文件。根据exportPattern("^[[:alpha:]]+")
中的建议,我也尝试添加行official vignette,但这没有用。
[另外,我想我已经检查了这些答案here给出的所有框,但仍然无济于事。
当我尝试从R包中加载某些c ++函数时,会遇到一些麻烦。运行devtools :: check()会产生>检查R代码中是否可能存在问题... ...
importFrom
中的useDynLib
和NAMESPACE
调用很重要。切换到手动创建的NAMESPACE
文件或添加