Я не могу найти способ добавить метод S4 show
в экспортируемый класс S4 без использования .onLoad
. Пример галереи Rcpp предлагает "Rcpp_yourclassname", так как имя объекта должно быть достаточным, но на практике мой пакет жалуется, что не может найти класс:
Loading RcppS4show
in method for ‘show’ with signature ‘"Rcpp_Num"’: no definition for class “Rcpp_Num”
Это можно легко воспроизвести, используяскелет пакета модуля Rcpp:
# R console:
Rcpp::Rcpp.package.skeleton("RcppS4show", path = "/tmp", module = TRUE)
# In /tmp/RcppS4show edit the file:
# R/zzz.R
# ... as described below.
setwd("/tmp/RcppS4show")
devtools::load_all()
Добавьте это в конец R/zzz.R
:
setMethod("show", "Rcpp_Num", function(object) {
writeLines(paste("Num(x, y) =", object$x, object$y))
})
Я могу обойти это, обернув функции loadModule
и setMethod
в.onLoad
:
.onLoad <- function(libname, pkgname) {
loadModule("NumEx", TRUE)
setMethod("show", "Rcpp_Num", function(object) {
writeLines(paste("Num(x, y) =", object$x, object$y))
})
}
Теперь я вижу, как работает мой метод показа:
# R console:
new(Num)
#> Num(x, y) = 0 0
Однако, как документация по каркасу модуля, так и виньетка Rcpp-modules объяснятьчто .onLoad
устарело в пользу использования loadModule()
.
Кроме того, злоупотребление .onLoad()
заставляет devtools::check()
заметить, что writeLines()
из моего show
метода является плохой практикой:
> checking R code for possible problems ... NOTE
File ‘RcppS4show/R/zzz.R’:
.onLoad calls:
writeLines(paste("Num(x, y) =", object$x, object$y))
Package startup functions should use ‘packageStartupMessage’ to
generate messages.
See section ‘Good practice’ in '?.onAttach'.
Есть ли способ зарегистрировать методы S4 без использования .onLoad
?