Как указать, в каком порядке загружать методы S4 при использовании roxygen2

Я уже несколько раз сталкивался со следующей проблемой.

Допустим, у вас есть два класса, classA и classB, описанные в следующих файлах classA.R:

#' the class classA
#'
#' This is a class A blabla
#' \section{Slots}{\describe{\item{\code{A}}{a Character}}}
#' @ name classA
#' @rdname classA
#' @exportClass classA
setClass("classA",representation(A="character"))

И classB.R

#' the class classB
#'
#' This is a class B blabla
#' \section{Slots}{\describe{\item{\code{B}}{an object of class A}}}
#' @ name classB
#' @rdname classB
#' @exportClass classB
setClass("classB",representation(B="classA"))

Я полагал, что эти файлы были прочитаны roxygen2 в алфавитном порядке, но это не так. Если я попытаюсь собрать пакет, я могу получить следующую ошибку:

roxygenize("./myExample")
Error in getClass(Class, where = topenv(parent.frame())) :
   "ClassA" is not a defined class

Как я могу убедиться, что roxygenize() знает, в каком порядке читать файлы, т.е. определение какого класса следует читать перед другим?


Примечание. Я знаю, что ответил на свой вопрос. Это потому, что я довольно часто сталкивался с этой проблемой и понял, как правильно это сделать, посмотрев на код roxygen2. Итак, для справки, вот мои выводы.


person Joris Meys    schedule 22.11.2012    source источник


Ответы (1)


Есть два способа добиться этого:

Как описано в ?collate_roclet, вы можете использовать тег @include, чтобы указать, какой класс должен быть прочитан перед каким. В этом случае вы можете добавить в файл classB.r следующую строку прямо перед фактическим кодом R:

#' @include classA.r

Эти теги считываются специально для обновления поля Collate в файле DESCRIPTION и являются рекомендуемым способом решения проблемы.

В некоторых случаях зависимости могут быть настолько сложными, что вам захочется просмотреть их самостоятельно, а не полностью полагаться на добавление тегов @include в кодовую базу. В этом случае вы можете просто указать поле Collate в конце файла DESCRIPTION, например:

Package: myExample
Type: Package
...
Collate:
    'classA.R'
    'classB.R'

Функция roxygenize() сначала проверяет файл DESCRIPTION и загружает все указанные там файлы в том порядке, в котором они указаны. Только после этого загружается остальная часть пакета.

person Joris Meys    schedule 22.11.2012
comment
@hadley Как я писал в своем вопросе, я попробовал тег @include, и он также объединил файлы справки для разных классов (что не входило в мои намерения). Он прекрасно работает с полем «Разбор по копиям», но я надеюсь, что вы найдете немного времени и вдохновения, чтобы включить элегантное решение для этого в следующую версию roxygen. - person Joris Meys; 22.11.2012
comment
@include не должен ничего менять, кроме сортировки. Можете ли вы привести минимальный воспроизводимый пример? - person hadley; 22.11.2012
comment
@hadley Я больше не могу воспроизводить. Я предполагаю, что это как-то связано с названием, которое я использовал (возможно, я использовал одно и то же имя дважды). Я обновляю соответственно - person Joris Meys; 23.11.2012