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.)
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
@MrFlick Dzięki za rozwiązanie i dzięki za przypomnienie, że nie jestem leniwy. –