我的R包使用Rcpp和RcppArmadillo。我在Rstudio中构建它。 我正在遵循H.Wickhams指南(R包装)。该软件包可以生成(带有一个警告,请参阅下文),安装并正常运行。
cpp脚本已使用//'标头记录
我有几个我认为都与之相关的问题:
如果我将<input id="text" type="textbox">
<button id="create">create file</button>
<a id="download"> download file </a>
添加到cpp文件,则//'@export
的条目将添加到export()
。应该不是export(filename)吗?
NAMESPACE
文件包含一个NULL值,在构建期间我收到一条警告“警告:RcppExports.R
:缺少名称” 。为什么是这样?我该如何纠正?
我如何阅读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);
}
答案 0 :(得分:2)
你需要有类似的东西
//' @export
// [[Rcpp::export]]
在函数定义之前 right 。第一个是Roxygen,说该功能将公开给用户界面。第二行告诉Rcpp导出到R端-即这些函数只需放入/导出到RcppExports.Rcpp
和RcppExports.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
}