Необходимо ли е да експортирате разширения на базов метод в R пакет? Последици от документацията?

По принцип бих могъл да запазя тези разширения неекспортирани и това също ще ми позволи да не добавям излишна документация за тези вече добре документирани методи, като същевременно също така предавам R CMD check myPackage без докладвани WARNINGs.

Кои са някои от недостатъците, ако има такива? Възможно ли е това да се препоръчва, за да запазите разширенията на основните методи разделени в рамките на пакета, който ги дефинира? Като алтернатива, това ще затрудни ли друг пакет да зависи от моя, ако някои основни разширения на метода не се експортират?

Например, ако не документирам и не експортирам следното:

setMethod("show", "myPackageSpecialClass", function(object){ show(NA) })

Опитвам се да изясня някои от тези по-фини детайли на най-добрите практики с пространства от имена и разширения на базов метод.


person Paul McMurdie    schedule 20.01.2012    source източник


Отговори (1)


Ако не експортирате методите, тогава потребителите (или в командния ред, или се опитват да използват вашите класове и методи в техния собствен пакет чрез импортиране) няма да могат да ги използват -- вашият клас ще бъде показан с show,ANY-method .

Вие не документирате общия show, а по-скоро метода, подходящ за вашия клас, show,myPackageSpecialClass-method. Ако във вашето NAMESPACE вие

import(methods)
exportMethods(show)

(имайте предвид, че няма начин да експортирате само някои методи в генеричното шоу) и да не предоставите документация, R CMD check ще се оплаче

* checking for missing documentation entries ... WARNING
Undocumented S4 methods:
  generic 'show' and siglist 'myPackageSpecialClass'
All user-level objects in a package (including S4 classes and methods)
should have documentation entries.
See the chapter 'Writing R documentation files' in the 'Writing R
Extensions' manual.

Вашият пример (знам, че не е предназначен да бъде сериозен метод за показване :) ) е добра илюстрация защо методите могат да бъдат документирани -- обяснявайки на потребителя защо всеки път, когато се опитват да покажат обекта, получават NA, когато са били очаквайки някакво описание на обекта.

Един подход към документацията е да се групират методи с класа в един Rd файл, myPackageSpecialClass-class.Rd. Този файл ще съдържа псевдоним

\alias{show,myPackageSpecialClass-method}

и Използване

\S4method{show}{myPackageSpacialClass}(object)

Това работи, стига да не се използва фантастично множествено изпращане, т.е. е ясно за кой клас се прилага даден метод. Ако потребителят поиска помощ с ?show, той винаги се насочва към страницата за помощ на пакета с методи. За помощ относно вашите методи / клас те ще трябва да поискат този конкретен вид помощ. Има няколко начина да направите това, но моят любим е

class ? myPackageSpecialClass
method ? "show,myPackageSpecialClass"

Това няма да е интуитивно за средния потребител; (клас|метод)? ... формулировката не се използва широко и спецификацията на "generic,signature" изисква много разбиране за това как работи S4, включително вероятно посещение на selectMethod(show, "myPackageSpecialClass") (тъй като методът може да бъде имплементиран в клас, от който myPackageSpecialClass наследява) или showMethods(class="myPackageSpecialClass", where=getNamespace("myPackage")) (защото се чудите какво можете да правите с myPackageSpecialClass).

person Martin Morgan    schedule 20.01.2012
comment
Но не трябва да документирате експортирани методи, нали? (Това със сигурност важи за S3) - person hadley; 20.01.2012
comment
експортираните методи трябва да бъдат документирани; Добавих това към отговора. - person Martin Morgan; 20.01.2012
comment
Мартин, когато казваш Един подход към документацията е да се групират методи с класа, имаш предвид документиране на повечето/всички нови разширения на метода за този клас в един клас-документ? напр. myPackageSpecialClass-class.Rd ще включва документация за настройките на базовите методи, които са разширени. И при този подход има ли начин да се избегне екранът за уточняване на недвусмислеността за ?show (в нашия пример)? - person Paul McMurdie; 20.01.2012
comment
@PaulMcMurdie -- опитах да актуализирам отговора, да, единият подход е да се документират нови методи с класа, върху който работят. Но не, вие не документирате show отново, така че не е необходима многозначност. - person Martin Morgan; 20.01.2012
comment
@hadley Създадох допълнителен въпрос за това как да постигна това с Roxygen2: stackoverflow.com/questions/8947483/ ; тъй като общият псевдоним се добавя автоматично към целта @rdname, което мисля, че не искаме в този случай. - person Paul McMurdie; 21.01.2012