[英]rcpp functions not exporting in r package
当我尝试从我的 R package 加载一些 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 评论方面做得很好,所以我一定在使用它们的地方使用了错误的 function。 需要明确的是,我可以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)
}
也许这是我的NAMESPACE
文件。 我已经为这些尝试了一些东西。 最近的尝试是使用我在这里和这里找到的建议:
# 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:]]+")
,但这没有用。
另外,我想我已经在这里检查了这些答案给出的所有框,但仍然无济于事。
NAMESPACE
中的importFrom
和useDynLib
调用很重要。 切换到手动创建的NAMESPACE
文件或添加
#' @useDynLib thmc, .registration = TRUE
#' @importFrom Rcpp evalCpp
到您的roxygen2
代码。 这里有 R 评论,因为我通常会为此使用thmc-package.R
。 您也可以在使用 C++ 注释时将其放入do_comps.cpp
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.