R包中的c ++文档

时间:2018-11-28 17:52:08

标签: c++ r namespaces export

我的R包使用Rcpp和RcppArmadillo。我在Rstudio中构建它。 我正在遵循H.Wickhams指南(R包装)。该软件包可以生成(带有一个警告,请参阅下文),安装并正常运行。

cpp脚本已使用//'标头记录

我有几个我认为都与之相关的问题:

  1. 如果我将<input id="text" type="textbox"> <button id="create">create file</button> <a id="download"> download file </a> 添加到cpp文件,则//'@export的条目将添加到export()。应该不是export(filename)吗?

  2. NAMESPACE文件包含一个NULL值,在构建期间我收到一条警告“警告:RcppExports.R:缺少名称” 。为什么是这样?我该如何纠正?

  3. 我如何阅读cpp脚本的帮助文件。文件名似乎不像软件包中的R文件那样起作用?

编辑:.cpp中的代码片段

RcppExports.R:18

RcppExports.R中的代码(此NULL是上面提到的警告)

//' @export
#include <RcppArmadillo.h>
// [[Rcpp::export]]
arma::mat myfunc(int nSize, ... ,arma::cube suitability) { 
   do some stuff
}

和RccpExports.cpp中的代码

#' @export
NULL
myfunc <- function(nSize, ..., suitability) {
   .Call('_myfunc', PACKAGE = 'mypackage', nSize, ... , suitability)
}

解决方案:感谢Anders和Ralf

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

using namespace Rcpp;

// myfunc
arma::mat myfunc(int nSize, ..., arma::cube suitability);
RcppExport SEXP _myfunc(SEXP nSizeSEXP, SEXP suitabilitySEXP) {
BEGIN_RCPP
  Rcpp::RObject rcpp_result_gen;
  Rcpp::RNGScope rcpp_rngScope_gen;
  Rcpp::traits::input_parameter< int >::type nSize(nSizeSEXP);
  Rcpp::traits::input_parameter< arma::cube >::type suitability(suitabilitySEXP);
  rcpp_result_gen = Rcpp::wrap(myfunc(nSize, ..., suitability));
  return rcpp_result_gen;
END_RCPP
}

static const R_CallMethodDef CallEntries[] = {
    {"_myfunc", (DL_FUNC) &_myfunc, 9},
   {NULL, NULL, 0}
};

RcppExport void R_init_mypackage(DllInfo *dll) {
   R_registerRoutines(dll, NULL, CallEntries, NULL, NULL);
   R_useDynamicSymbols(dll, FALSE);
}

2 个答案:

答案 0 :(得分:2)

你需要有类似的东西

//' @export
// [[Rcpp::export]]
在函数定义之前

right 。第一个是Roxygen,说该功能将公开给用户界面。第二行告诉Rcpp导出到R端-即这些函数只需放入/导出到RcppExports.RcppRcppExports.R中即可。只有在提供了后者的情况下,前者才有意义的两件事。

Roxygen注释\\'仅保留到RcppExports.R文件中。

编辑: 从您的评论中,我看到您提到了RcppArmadillo。您只需#include <RcppArmadillo.h>文件顶部一次.cpp。不需要// [[Rcpp::depends(RcppArmadillo)]]

答案 1 :(得分:0)

roxygen注释必须位于它所应用的功能旁边。这些评论可能有不同的组合:

#include <RcppArmadillo.h>

//' @export
// [[Rcpp::export]]
arma::mat myfunc(int nSize, ... ,arma::cube suitability) { 
   do some stuff
}

//' @export
// [[Rcpp::export]]
arma::mat myotherfunc(int nSize, ... ,arma::cube suitability) { 
   do some other stuff
}

// C++ internal function, i.e. usable in the packages C++ code
arma::mat cppinternal(int nSize, ... ,arma::cube suitability) { 
   do some other stuff
}

// R internal function, i.e. usable in the packages R code 
// [[Rcpp::export]]
arma::mat Rinternal(int nSize, ... ,arma::cube suitability) { 
   do some other stuff
}