как я могу добавить roxygen @export все функции в пакет

Я принимаю существующий пакет. Пакет был написан с документацией .Rd до того, как R потребовал явного экспорта функций.

Моим первым шагом было преобразование документации в roxygen с помощью Rd2roxygen (большое спасибо Yihui и Hadley за этот пакет!).

Но теперь пакет не работает, потому что не экспортируются функции. Я бы предпочел просто экспортировать все функции по умолчанию. На данный момент кажется, что мой общий подход будет состоять в том, чтобы определить регулярное выражение, которое можно найти для каждой функции ( ##' @return будет хорошей целью), и вставить ##' @export в строку над ним,

В псевдокоде:

for all files in the `R/` directory{
   for each line starting in `##' @return`{ 
      insert `##' @export` in the preceeding line
}}

Результатом будет замена:

##' @return something

с участием

##' @export
##' @return something that varies with each function

Получить список функций и добавить их в NAMESPACE не получится, потому что devtools::document("mypackage") перезапишет его, если @export не будет в коде roxygen над каждой функцией.

Вопрос: как наиболее эффективно добавить @export в документацию roxygen для каждой функции в пакете?

Еще лучшей альтернативой будет анализ операторов NAMESPACE и export и method соответственно.


person Abe    schedule 29.01.2013    source источник
comment
В документации довольно ясно, что это не поддерживается в Rd2roxygen и что исправления приветствуются. (См. package?Rd2roxygen) Так что, если вы получите хороший ответ, вам следует рассмотреть возможность отправки его в виде патча.   -  person GSee    schedule 29.01.2013


Ответы (1)


РЕДАКТИРОВАТЬ: Используя только функции, экспортированные в NAMESPACE, и предполагая, что они не имеют инструкции @export где-то в своем блоке Roxygen, мы можем выполнить хакерский анализ всех функций exported:

NAMESPACE <- readLines("NAMESPACE")
exported_fns <- grep( "^export\\(", NAMESPACE, value=TRUE )
exported_fn_names <- gsub( "export\\((.*)\\)", "\\1", exported_fns )
fn_match_re <- paste("^", exported_fn_names, " ?<- ?", sep="")

for( file in list.files("./R", full.names=TRUE) ) {
  doc <- readLines( file )
  for( i in seq_along(doc) ) {
    if( any( sapply( fn_match_re, function(x) {
      length( grep( x, doc[i] ) ) > 0
      } ) ) ) {
      doc[i] <- paste( "##' @export", doc[i], sep="\n" )
    }
  }
  writeLines( doc, file )
}
person Kevin Ushey    schedule 29.01.2013
comment
хм. это хорошее начало с двумя очевидными ошибками: 1) он записывает несколько ##' @export\n##' @return для каждой функции и 2) содержимое @return теряется - person Abe; 29.01.2013
comment
Ах, если вы хотите убедиться, что соответствуете только @return, вы можете попробовать gsub( "^##' @return (.*)", "##' @export\n##' @return \\1", doc ). Это предполагает, что за всеми операторами @return следует пробел и некоторая возвращаемая строка. Я не был уверен, хотите ли вы как-то изменить оператор @return. - person Kevin Ushey; 29.01.2013
comment
Было бы здорово, если бы кто-нибудь из вас отправил мне запрос на вытягивание на Github. Повязка, которую вы получили, достаточно хороша в моих глазах. Спасибо! - person Yihui Xie; 29.01.2013
comment
Прохладный! Я отправил запрос на вытягивание, в котором все было оформлено как функция. - person Kevin Ushey; 29.01.2013
comment
К вашему сведению, @export теперь поддерживается в Rd2roxygen 1.2. - person Yihui Xie; 11.06.2013