Документация c ++ в пакете R - PullRequest
0 голосов
/ 28 ноября 2018

мой пакет R использует Rcpp и RcppArmadillo.Я построил это в Rstudio.Я следую руководству H.Wickhams (R-пакеты).Пакет собирается (с одним предупреждением, см. Ниже), устанавливается и работает нормально.

Сценарии cpp были задокументированы с использованием // 'headers

У меня есть несколько вопросов, которые, я думаю, все связаны:

  1. Если я добавлю //'@export в файл cpp, то в NAMESPACE будет добавлена ​​запись export().Разве это не должен быть экспорт (имя файла)?

  2. Файл RcppExports.R содержит значение NULL, и во время сборки я получаю предупреждение "Предупреждение: RcppExports.R:18: отсутствует имя«.Почему это?Как мне исправить это?

  3. Как мне прочитать файл справки для скрипта cpp.? Кажется, что имя файла работает не так, как для файлов R в пакете?

РЕДАКТИРОВАТЬ: фрагмент кода из .cpp

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

Код из RcppExports.R (Это NULL - предупреждение, упомянутое выше)

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

и код из RccpExports.cpp

// 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);
}

РЕШЕНИЕ : Спасибо Андерсу и Ральфу

#include <RcppArmadillo.h>
//' calculates stuff
//'
//' Calculates the stuff
//'
//'@param nSize number of some stuff
//'@param p2
//'@param p3
//'@param p4
//'@param p5
//'@param p6
//'@param p7
//'@param p8
//'@param suitability 3D array 
//' @export
// [[Rcpp::export]]
arma::mat myfunc(int nSize, ... ,arma::cube suitability) { 
  do some stuff
}

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Комментарий 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
}
0 голосов
/ 28 ноября 2018

Вам нужно иметь что-то вроде

//' @export
// [[Rcpp::export]]

вправо до определения вашей функции.Во-первых, Roxygen говорит, что функция должна быть доступна пользовательскому интерфейсу.Вторая строка говорит Rcpp об экспорте в сторону R - т.е. функции просто помещаются / экспортируются в RcppExports.Rcpp и RcppExports.R.Две разные вещи, где первое имеет смысл, только если предоставлено второе.

Комментарии Roxygen \\' просто передаются в файл RcppExports.R.

Редактировать: Из твоих комментариев я вижу твой комментарий RcppArmadillo.Вам нужно всего лишь #include <RcppArmadillo.h> один раз наверху вашего .cpp файла.// [[Rcpp::depends(RcppArmadillo)]] не нужен.

...