2014-07-06 19 views
13

Od wersja 4.0.0, znacznik @S3method został uznany za przestarzały na rzecz używania @export.Eksportowanie metod innych niż S3 z kropkami w nazwie za pomocą roxygen2 v4

Pakiet próbuje wykryć, czy funkcja jest metodą S3, i automatycznie dodaje wiersz S3method(function,class) do pliku NAMESPACE, jeśli uważa, że ​​jest nim.

Problem polega na tym, że jeśli funkcja nie jest metodą S3, ale jej nazwa zawiera ., to czasami rtęć powoduje błąd i dodaje linię, gdy nie powinna.

Czy istnieje sposób na stwierdzenie, że dana funkcja nie jest metodą S3?


Oto przykład odtwarzalny.

Mam pakiet, który importuje R.oo, z funkcją o nazwie check.arg.

library(roxygen2) 
package.skeleton("test") 
cat("Imports: R.oo\n", file = "test/DESCRIPTION", append = TRUE) 
writeLines(
    "#' Check an argument 
#' 
#' Checks an argument. 
#' @param ... Some arguments. 
#' @return A value. 
#' @export 
check.arg <- function(...) 0", 
    "test/R/check.arg.R" 
) 
roxygenise("test") 

Teraz przestrzeń nazw zawiera wiersz S3method(check,arg).

check jest generic S3 w R.oo, więc roxygen próbuje być sprytny i zgadywanie, że chcę check.arg być metodą S3. Niestety, te funkcje nie są powiązane, więc nie.

(Aby uprzedzić sugestie, że ja po prostu zmienić nazwę check.arg: jest to starszy kod napisany przez innych, a ja stworzył wymiany checkArg, ale muszę zostawić check.arg jako nieaktualnych funkcji dla kompatybilności.)

+4

Wierzę, że wystarczy użyć '@ export' z pełną nazwą funkcji. Byłoby pomocne dołączenie [przykładu odtwarzalnego] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) do przetestowania. – MrFlick

+0

@MrFlick Dzięki za rozwiązanie i dzięki za przypomnienie, że nie jestem leniwy. –

Odpowiedz

12

jako Pan Flick skomentował, dołączając pełną nazwę funkcji do linii roxygen działa poprawnie. Jeśli zmienić linię:

#' @export check.arg 

następnie plik NAMESPACE zawiera:

export(check.arg) 
+4

Innym problemem, którym należy się zająć, jest instrukcja użycia, która mówi "## S3 method for class" check '\ n check (...) ', chyba że ją naprawisz. Jednym ze sposobów jest dodanie dyrektywy '## '@usage check.arg (x)', nie wiem, czy jest lepszy sposób. –

+4

** Pamiętaj, że ** powyższe rozwiązanie dostarczy Ci prawidłowy wpis w pliku 'NAMESPACE'. Jednak, aby funkcja * została poprawnie udokumentowana, musisz również dodać znacznik '@ usage', w przeciwnym razie pojawi się komunikat' ## S3 method for class 'arg'' nad sygnaturą twojej funkcji w '. Plik Rd i podpis w pliku pomocy to 'check (...)', a nie 'check.arg (...)'. – Jthorpe

-1

Używaj @method generic class i @export zamiast @S3method. Proszę spojrzeć na ten wątek: S3 method help (roxygen2)

+1

To pytanie nie dotyczy sposobu dokumentowania metod S3; chodzi tu o przeciwny problem dokumentowania rzeczy, które nie są metodami S3 (ale ropień myśli, że tak). –

Powiązane problemy