วิธีการบันทึกสล็อตคลาส S4 อย่างถูกต้องโดยใช้ Roxygen2


306

สำหรับการทำเอกสารคลาสที่มี roxygen (2) การระบุหัวเรื่องและคำอธิบาย / รายละเอียดดูเหมือนจะเหมือนกับฟังก์ชันวิธีการข้อมูลและอื่น ๆ อย่างไรก็ตามสล็อตและการสืบทอดเป็นสัตว์ประเภทของตัวเอง แนวปฏิบัติที่ดีที่สุด - ปัจจุบันหรือที่วางแผนไว้สำหรับการบันทึกคลาส S4 ใน roxygen2 คืออะไร

ขยันเนื่องจาก:

ฉันพบ@slotแท็กในคำอธิบายก่อนหน้าของ roxygen การโพสต์รายชื่อผู้รับจดหมาย R-forge ปี 2008 ดูเหมือนจะบ่งบอกว่านี่เป็นสิ่งที่ตายแล้วและไม่มีการสนับสนุน@slotใน roxygen:

นี่เป็นความจริงของ roxygen2 หรือไม่ โพสต์ที่กล่าวถึงก่อนหน้านี้แนะนำให้ผู้ใช้ควรทำรายการแยกรายการของตนเองด้วยมาร์กอัป LaTeX เช่นคลาส S4 ใหม่ที่ขยาย"character"คลาสจะมีการเข้ารหัสและจัดทำเอกสารดังนี้:

#' The title for my S4 class that extends \code{"character"} class.
#'
#' Some details about this class and my plans for it in the body.
#'
#' \describe{
#'    \item{myslot1}{A logical keeping track of something.}
#'
#'    \item{myslot2}{An integer specifying something else.}
#' 
#'    \item{myslot3}{A data.frame holding some data.}
#'  }
#' @name mynewclass-class
#' @rdname mynewclass-class
#' @exportClass mynewclass
setClass("mynewclass",
    representation(myslot1="logical",
        myslot2="integer",
        myslot3="data.frame"),
    contains = "character"
)

อย่างไรก็ตามแม้ว่างานนี้นี้\describe, \itemแนวทางในการจัดเก็บเอกสารในช่องที่ดูเหมือนว่าไม่สอดคล้องกับส่วนที่เหลือของ roxygen (2) ในการที่ไม่มี@แท็ก -delimited roxygenize()และช่องสามารถไปไม่มีเอกสารไม่มีการคัดค้านจาก นอกจากนี้ยังบอกว่าไม่มีอะไรเกี่ยวกับวิธีที่สอดคล้องกันในการจัดทำเอกสารการสืบทอดของคลาสที่ถูกกำหนดไว้ ฉันคิดว่าการพึ่งพาโดยทั่วไปยังคงใช้งานได้ดี (หากสล็อตเฉพาะต้องการคลาสที่ไม่ใช่ฐานจากแพ็คเกจอื่น) โดยใช้@importแท็ก

ดังนั้นเพื่อสรุปสิ่งที่เป็นแนวปฏิบัติที่ดีที่สุดในปัจจุบันสำหรับสล็อต roxygen (2)?

ดูเหมือนจะมีสามตัวเลือกในการพิจารณาในขณะนี้:

  • เอ - รายการแยกรายการ (เป็นตัวอย่างข้างต้น)
  • B - @slot... แต่ด้วยแท็ก / การใช้งานพิเศษฉันพลาดไป ฉันไม่สามารถรับ @slot เพื่อทำงานกับ roxygen / roxygen2 ในรุ่นที่มีการรวมไว้เพื่อแทนที่รายการที่แยกรายการในตัวอย่างด้านบน ตัวอย่างข้างต้นใช้งานได้กับ roxygen อีกครั้ง (2)
  • C - แท็กทางเลือกอื่นสำหรับการระบุช่องเช่น@paramที่จะทำให้สำเร็จในสิ่งเดียวกัน

ฉันยืม / ขยายคำถามนี้จากโพสต์ที่ฉันทำกับroxygen2หน้าพัฒนาบนGitHub


16
@slotน่าจะเป็นสิ่งที่คุณต้องการในระยะยาว แต่ก็จะต้องมีการดำเนินการครั้งแรก ...
ฮัดลีย์

3
ขอบคุณ! เป็นเรื่องดีที่รู้ ฉันดีใจที่รหัสของฉันมีsetClassข้อความน้อยกว่าsetMethodมาก การเปลี่ยนแปลงครั้งเดียว@slotจะถูกนำไปใช้จะไม่เจ็บปวดเกินไป
Paul McMurdie

8
การอภิปรายบางส่วนเกี่ยวกับ @slot: github.com/klutometis/roxygen/pull/85
Brian Diggs

คำถามที่เกี่ยวข้อง: stackoverflow.com/questions/13642092/ …
Joris Meys

2
เรียน S4 ในขณะนี้ได้รับการสนับสนุนอย่างเต็มที่ในรุ่น Roxygen2 3 (ที่มีอยู่บนGitHub )
Gregor Thomas

คำตอบ:


29

อัปเดตคำตอบสำหรับ Roxygen2 5.0.1 ปัจจุบันจนถึง 6.0.1

สำหรับ S4 แนวปฏิบัติที่ดีที่สุดในขณะนี้คือการจัดทำเอกสารโดยใช้@slotแท็ก:

#' The title for my S4 class that extends \code{"character"} class.
#'
#' Some details about this class and my plans for it in the body.
#'
#' @slot myslot1 A logical keeping track of something.
#' @slot myslot2 An integer specifying something else.
#' @slot myslot3 A data.frame holding some data.
#'
#' @name mynewclass-class
#' @rdname mynewclass-class
#' @export

บน sidenote @exportClassจำเป็นเฉพาะในบางกรณีวิธีทั่วไปในการส่งออกฟังก์ชั่นที่ใช้ใน@exportขณะนี้ คุณไม่จำเป็นต้องส่งออกชั้นเรียนยกเว้นกรณีที่คุณต้องการให้แพ็กเกจอื่นสามารถขยายชั้นเรียนได้

ดูเพิ่มเติมที่http://r-pkgs.had.co.nz/namespace.html#exports

อัปเดตคำตอบสำหรับ Roygen2 3.0.0 ปัจจุบัน ณ 5.0.1

สำหรับ S4 แนวทางปฏิบัติที่ดีที่สุดคือเอกสารในแบบฟอร์ม:

#'  \section{Slots}{
#'    \describe{
#'      \item{\code{a}:}{Object of class \code{"numeric"}.}
#'      \item{\code{b}:}{Object of class \code{"character"}.}
#'    }
#'  }

สิ่งนี้สอดคล้องกับการแทนค่าภายในของสล็อตเป็นรายการภายในวัตถุ ในขณะที่คุณชี้ให้เห็นว่าไวยากรณ์นี้แตกต่างจากบรรทัดอื่นและเราอาจหวังว่าโซลูชันที่มีประสิทธิภาพมากขึ้นในอนาคตที่รวมความรู้เกี่ยวกับการสืบทอด - แต่วันนี้ไม่มีอยู่จริง

ตามที่ระบุโดย @Brian Diggs คุณลักษณะนี้ถูกดึงเข้าสู่ 3.0.0 การสนทนาเพิ่มเติมที่https://github.com/klutometis/roxygen/pull/85


2
คุณใช้การดำเนินการโดย @Brian Diggs หรือไม่ มันใช้งานได้หรือไม่ คุณคิดว่าคุณสามารถให้รายละเอียดเกี่ยวกับวิธีการ@slotนั้นได้หรือไม่ ฉันไม่ได้ลองใช้มันรอ (อาจขี้เกียจ) สำหรับ@slotวิธีแก้ปัญหาที่รออยู่นี้ ฉันรู้ว่าไม่ใช่คำถามที่ถูกวาง แต่ขึ้นอยู่กับความคิดเห็น (รวมถึง @ hadley ของ) ดูเหมือนว่า@slotเป็นคำตอบ "ของจริง" ฉันเห็นด้วยกับการประเมินของคุณว่ารายการแยกรายการ (ตามคำถามของฉัน) เป็นแนวปฏิบัติที่ดีที่สุดในปัจจุบัน แต่หวังว่าจะมีการแทนที่ในไม่ช้า
Paul McMurdie

19

วิธีการแก้ปัญหาที่จัดทำโดย Full Decent นั้นใช้ได้ถ้าคุณไปสำหรับการบันทึกสล็อตในไฟล์ Rd เอง เมื่อใช้roxygen2คุณสามารถใช้แท็กจะทำพื้นเดียวกันกับ@section \describeตัวอย่าง:

#' The EXAMPLE class
#'
#' This class contains an example. This line goes into the description
#'
#' This line and the next ones go into the details.
#' This line thus appears in the details as well.
#'
#'@section Slots: 
#'  \describe{
#'    \item{\code{slot1}:}{Matrix of class \code{"numeric"}, containing data from slot1}
#'    \item{\code{slot2}:}{Object of class \code{"character"}, containing data that needs to go in slot2.}
#'  }
#'
#' @note You can still add notes
#' @name EXAMPLE 
#' @rdname EXAMPLE
#' @aliases EXAMPLE-class
#' @exportClass EXAMPLE
#' @author Joris Meys

14

roxygen2 v4.1 + และเอกสารล่าสุดของ Hadley สำหรับการทำเช่นนี้:

http://r-pkgs.had.co.nz/man.html#man-classes

ฉันยังไม่ได้ลองใช้กับ RC แต่ตอนนี้ใช้งานได้สำหรับ S4 ในตอนนี้

ก่อนหน้านี้

ดูเหมือนว่าสล็อตคลาส S4 ได้รับการสนับสนุนอย่างเต็มที่ภายใต้ Roxygen2 เวอร์ชัน 3.0+:

http://blog.rstudio.org/2013/12/09/roxygen2-3-0-0/

"บันทึกคลาส S4, วิธี S4 และคลาส RC ของคุณด้วย roxygen2 - คุณสามารถลบวิธีแก้ไขปัญหาที่ใช้@aliasและปลอดภัย@usageและเพียงใช้ roxygen2 เพื่อทำสิ่งที่ถูกต้อง"


2
@slot ทำงานได้อย่างสมบูรณ์แบบคุณสามารถใช้ (หรือ @field) เพื่อทำเอกสารปลอมเป็นคลาส S3 ได้
Brandon Bertelsen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.