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