2015-03-29 4 views
4

Я пытаюсь создать класс S4 с помощью собственного метода инициализации и отдельно документировать их с помощью Roxygen2. Предполагая, что мой класс определяется как:Есть ли способ документировать класс S4 и его конструктор отдельно с помощью Roxygen2

#' This is the classA 
#' @name classA-class 
#' @rdname classA-class 
######## @aliases NULL 
#' @exportClass classA 
classA <- setClass(Class = "classA", slots = list(member = "ANY")) 

С помощью метода инициализации:

#' This is the constructor 
#' @name classA 
#' @rdname classA 
#' @export classA 
setMethod("initialize", "classA", function(.Object, x) { 
      [email protected] = x 
      return(.Object) 
     }) 

После компиляции пакета с Roxygen2. Я получил 2 .Rd файлы с 3 странице справки:

  • CLASSA-класс: Это CLASSA
  • CLASSA: Это CLASSA
  • CLASSA: Это конструктор

Оба class?classA и ?classA покажет classA-class справочную страницу. Это, безусловно, то, что я хочу, как я надеюсь, class?classA приведет к classA-class: This is the classA, а ?classA приведет к classA: This is the constructor.

Итак, мой вопрос заключается в том, как отделить документацию по документации к классу и конструкторскую документацию с Roxygen2? Большое вам спасибо за вашу помощь.

(Я понимаю, что Roxygen2 поставит псевдонимы с именем класса для класса S4 по умолчанию. Но когда я установил@aliases NULL, помощи страницеclassA-class: This is the classAизбавится !! остался толькоclassA: This is the constructor)

ответ

3

Причины, по которым оба файла помощи отображаются в документации по классу, заключаются в том, что setClass всегда использует имя класса в качестве псевдонима для класса в документации. Кроме того, ваш метод для общего initialize, определенный для classA, указывает @rdname classA, который указывает его на classA-method.

Вот два решения:

Во-первых, вы можете упростить коды заголовков Roxygen2 и получить поведение, которое вы хотите, но вам нужно будет использовать @name для вызова метода инициализации нечто иное, чем classA.

#' \code{classA} class definition 
#' 
#' @slot member description of this slot here 
classA <- setClass(Class = "classA", slots = list(member = "ANY"))  

#' constructor for \link{classA-class} 
#' 
#' This is the constructor. 
#' @name initializeClassA 
#' @export 
setMethod("initialize", "classA", function(.Object, x) { 
    [email protected] = x 
    return(.Object) 
}) 

Это дает вам страницу CLASSA класса для ?classA и ?"classA-class" но для конструктора, вы получите все, что имя, которое вы использовали после @rdname, например, ?initializeClassA, если это то, что вы хотите.

Во-вторых, я бы рекомендовал, чтобы вы не использовали initialize вообще, вместо этого создавайте новые экземпляры classA, используя new("classA", memberValue). Вы можете определить прототип в определении класса, чтобы присвоить значения по умолчанию member, если хотите, и/или функции валидатора. Вам действительно нужна отдельная страница справки для конструктора?

+0

Большое вам спасибо за полезную информацию, Кен. На самом деле класс S4, который я пытаюсь построить, содержит 10 разных слотов, и я уже даю им значения по умолчанию с «прототипом». Проблема в том, что мой метод инициализации представляет собой немного сложную функцию, которая имеет сотни строк ...Поэтому я пытаюсь их разделить. В любом случае, как вы сказали, может быть лучше объединить страницу справки для метода инициализации и класса S4 вместе или дать другое имя конструктору. –

 Смежные вопросы

  • Нет связанных вопросов^_^