Как правильно документировать методы S4 с использованием roxygen2 - PullRequest
48 голосов
/ 09 сентября 2011

Я видел некоторые обсуждения в SO и других местах относительно того, как это должно быть или будет сделано в будущих версиях Roxygen2.Тем не менее, я застрял.Как я должен документировать документацию S4, а также его методы, используя Roxygen2?Рабочий пример для совершенно нового универсального / метода, а также пример для расширения базового универсального S4 был бы невероятно полезным.Я не хочу делать отдельную (в основном) избыточную документацию для каждого метода S4 одного и того же универсального.

Должная проверка: я нашел полезный пример для метода «извлечения».Однако он кажется устаревшим и неполным для моего вопроса.В документации класса используется тег @slot, который не поддерживается (больше не поддерживается).Он показывает только расширение основного метода S4 «[», а не полный пример Roxygen, включая документацию об универсальном S4.

Как правильно документировать S4 "[" и "[<-" методы с использованием roxygen? </a>

Если я полностью документирую новый универсальный S4 с заголовком, описание @param @return @name @aliases @docType @rdname, а затем задокументируйте метод S4 только с соответствующим @name @aliases @docType @rdname, я получаю следующее предупреждение R CMD check:

* checking for missing documentation entries ... WARNING
Undocumented S4 methods:
<< long list of apparently undocumented methods. E.g. generic 'plot' and siglist 'myClass1,ANY' >>
All user-level objects in a package (including S4 classes and methods)
should have documentation entries.

Сначала выглядело так, как будто ни один из моих методов S4 не был задокументирован таким образом с помощьюroxygen2 действительно работал.Тем не менее, до сих пор я заметил, что мои расширения основного метода «show» не имеют связанной ошибки, даже если они были задокументированы точно так же, как и остальные.Вот пример полной документации roxygen, которую я включил выше одним из методов show, который НЕ генерировал ошибку отсутствия документации:

#' @name show
#' @aliases show,myClass2-method
#' @docType methods
#' @rdname show-methods

Таким образом, я в растерянности.Как вы можете видеть, я включил соглашение для псевдонимов для методов S4, описанное в разделе документации S4 руководства по пакету R , а именно, что методы должны иметь псевдоним со следующим именем (без пробела):

generic,signature_list-method.

Каким-то образом это не полностью понимается R CMD check.

Наконец, после построения документации, используя:

library("devtools")
library("roxygen2")
document("mypkgname")
check_doc("mypkgname")

и сборку пакета,Я получаю действующую документацию.Любые заголовки из документации по конкретному методу оказываются в поле «Описание» довольно неловко.Таким образом, roxygen2 явно сделал что-то с документацией каждого метода и находится на правильном пути.Тем не менее, этого недостаточно, чтобы избежать большого и тревожного предупреждения от

> R CMD check mypkgname

Я посмотрел на файлы Rd, но я знаю еще меньше о них, чтобы быстро увидеть, в чем проблема, и я все равно знаюЯ хочу знать решение roxygen2, чтобы мне не приходилось манипулировать файлами Rd непосредственно после каждой редакции документации.

Так что это составной вопрос:

  1. Что такоетекущий рекомендуемый подход как для документации S4 generic, так и для документации метода S4 с roxygen2?

  2. Есть ли где-нибудь хороший пример, показывающий полные детали?

  3. Что может быть причиной и решением для предупреждения о том, что документация для большинства методов S4 отсутствует (даже при том, что методы с «отсутствующей» документацией фактически анализировали свои документы по roxygen2, и результирующие файлы Rd по крайней мере достаточно хорошиработать в пакете после R CMD build mypkgname)?

Ответы [ 2 ]

39 голосов
/ 15 сентября 2011

Официальная поддержка, объяснено в документации devtools

http://r -pkgs.had.co.nz / man.html # человеко-классы (прокрутите вниз до подраздела S4 ).

Текущий короткий пример с этой страницы воспроизводится в следующем (для удобства):

#' An S4 class to represent a bank account.
#'
#' @slot balance A length-one numeric vector
Account <- setClass("Account",
  slots = list(balance = "numeric")
)

Приведенная выше ссылка очень четко объясняет поддержку S3, S4 и RC через roxygen / devtools. Приведенное здесь объяснение должно заменить замену старого ответа ниже, который пока работает, но менее ясен и более сложен.

Старый ответ

Вот пример, который должен работать для большинства методов S4.

Для документирования универсальных S4 я нахожу следующие три строки, необходимые в большинстве моих универсальных заголовков:

#' @export
#' @docType methods
#' @rdname helloworld-methods

Где helloworld-methods заменено на the_name_of_your_generic-methods. Это будет имя Rd-файла, который содержит документацию для универсального и всех его методов. Это соглашение об именах не является обязательным, но распространенным и полезным. Тег @export необходим теперь, когда для вашего пакета требуется пространство имен, и вы хотите, чтобы этот метод был доступен пользователям вашего пакета, а не только другим методам / функциям в вашем пакете.

Я считаю, что для документирования методов необходимы только 2 строки с тегами @rdname и @aliases. Оператор @rdname должен точно совпадать с оператором для универсального выражения. Тег @aliases должен соответствовать соглашению об именах, описанному в официальном разделе документации S4 Запись расширений R .

#' @rdname helloworld-methods
#' @aliases helloworld,character,ANY-method

После запятых в имени @aliases не должно быть пробелов. Я не знаю точных правил, касающихся добавления ,ANY в конец списка подписей. Кажется, что шаблон состоит в том, что количество элементов во всех @aliases списках сигнатур должно соответствовать количеству элементов в самом длинном векторе сигнатуры среди методов. В приведенном ниже примере один из методов определен с 2-элементной сигнатурой, и поэтому R CMD check не был удовлетворен документацией, если ,ANY не был добавлен к тегу aliases других методов, даже если только их определение сигнатуры имеет один элемент.

Полный пример приведен ниже. Я построил это, и оно работает без предупреждений на уровне документации от R CMD check testpkg, используя исправленную ошибку вилку очень недавней версии devel roxygen2 (которую я сделал доступной) . Для быстрой установки этой вилки в вашей системе используйте library("devtools"); install_github("roxygen", "joey711"). Самая последняя версия roxygen2 не будет работать в этот момент из-за ошибки цитаты (описанной в отдельном ответе), но я ожидаю, что она будет включена очень скоро, и мой форк не понадобится. Для просмотра этого примера в контексте остальной части пакета и просмотра итоговых файлов документации (Rd) я сделал его доступным как тривиальный тестовый пакет на github под названием testpkg .

##############################################################
#' The title, in this case: Helloworld-ify the argument.
#'
#' Some additional details about this S4 generic and its methods.
#' The extra blank line between this section and the title is
#' critical for roxygen2 to differentiate the title from the
#' description section.
#'
#' @param x Description of \code{x}. The main argument in this
#'  example. Most often has such and such properties.
#'
#' @param y Description of \code{y}. An argument that is rarely
#'  used by \code{"helloworld"} methods. 
#'
#' @param ... Additional argument list that might not ever
#'  be used.
#'
#' @return A helloworld-ified argument. Oh, you'll see.
#' 
#' @seealso \code{\link{print}} and \code{\link{cat}}
#' 
#' @export
#' @docType methods
#' @rdname helloworld-methods
#'
#' @examples
#' helloworld("thisismystring")
#' helloworld(char2helloworld("thisismystring"))
#' helloworld(matrix(0,3,3))
#' helloworld(list(0,0,0))
#' helloworld(integer(0))
setGeneric("helloworld", function(x, y, ...){
    cat("Hello World!")
    cat("\n")
    standardGeneric("helloworld")
})

#' @rdname helloworld-methods
#' @aliases helloworld,ANY,ANY-method
setMethod("helloworld", "ANY", function(x, y, ...){
    cat(class(x))
})

#' @rdname helloworld-methods
#' @aliases helloworld,character,ANY-method
setMethod("helloworld", "character", function(x){
    show(x)
})

#' @rdname helloworld-methods
#' @aliases helloworld,character,character-method
setMethod("helloworld", c("character", "character"), function(x, y){
    show(x)
})

В этом примере предполагается, что вам не нужна отдельная документация по конкретному методу, потому что ваши методы не сильно отклоняются от поведения, которое можно ожидать на основе универсального документа. В roxygen2 есть средства для обработки этого альтернативного случая с использованием тега @usage, но детали лучше обработать отдельным вопросом SO.

Таким образом, большая часть ваших усилий по документированию идет в заголовке roxygen над общим определением. Это имеет некоторую основу в коде, так как универсальный должен включать все конкретные аргументы, которые появляются в любом из впоследствии определенных методов. Обратите внимание, что аргументы, которые обрабатываются как часть ... в списке аргументов, не включены и не должны специально документироваться, но сам ... должен быть задокументирован также и над родовым (см. Полный пример ниже).

Для получения более подробной информации об основах документирования функций, существует вики , старая виньетка roxygen , а также сайт разработки roxygen2 на github . Существует также SO вопрос по документации R с Roxygen в целом.

9 голосов
/ 13 сентября 2011

Я обнаружил, что ответ на часть (3) - не очень отсутствующая документация по методам S4 - из-за того, что кавычки ошибочно добавляются вокруг тегов \ alias при использовании соглашения об именовании S4; скорее всего ошибка, возникающая в результате обработки текста псевдонима, который содержит запятую как часть его имени. Это все еще верно для последней версии roxygen2 на момент публикации. Я только что опубликовал более подробное описание ошибки с воспроизводимым примером на странице gxygenub roxygen2:

https://github.com/klutometis/roxygen/issues/40

Коротко,

#' @aliases show,helloworld-method

становится

\alias{"show,helloworld-method"}

в полученном Rd-файле. Удаление цитат удаляет предупреждение R CMD check, и документация создается и работает в обоих случаях.

Я думаю, что части (1) и (2) этого вопроса (лучшие практики; хорошие примеры) все еще остаются открытыми.

...