Как указать, в каком порядке загрузить методы 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. Так что для справки, вот мои выводы.

Ответ 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 и загружает файлы, которые указаны там сначала, в том порядке, в котором они указаны. Только тогда загружается остальная часть пакета.