Неслотовые параметры в методах инициализации для объектов S4
Я пытаюсь определить метод для класса S4. Согласно документации отmethods::new
Методы инициализации часто пишутся тогда, когда естественными параметрами, описывающими новый объект, не являются имена слотов. Если вы определяете такой метод, вы должны включить
...
в качестве формального аргумента, и ваш метод должен передавать такие аргументы черезcallNextMethod
.
и документация поmethods::initialize-methods
Например, предположим, что вы хотите определить метод для своего класса со специальным аргументом x, но вы также хотите, чтобы пользователи могли специально устанавливать слоты. Если вы хотите, чтобы x переопределял информацию о слоте, начало определения вашего метода может выглядеть примерно так:
function(.Object, x, ...) {
Object \<- callNextMethod(.Object, ...)
if(!missing(x)) { # do something with x
Конечно, мой вариант использования немного сложнее. Слот представляет собой объект S3, которому присваивается значение S4.setOldClass
. Я хочу инициализировать объект S3 в слоте только с помощью строки, предоставленной пользователем, и таким образом скрыть от пользователя внутреннюю реализацию . В то же время я хочу сохранить возможность для опытного пользователя инициализировать внутренний объект и предоставить егоnew
метод, если необходимо.
Основной пример того, чего я пытаюсь достичь:
setClass(
Class = "myClass",
slots = c(
myString = "character"
)
)
setMethod(
"initialize",
signature = "myClass",
definition = function(.Object, string = "Hello", ...) {
.Object <- callNextMethod(.Object, ...)
.Object@myString <- paste0("My string is ", string)
validObject(.Object)
.Object
}
)
Однако если я это сделаю, я всегда получаю сообщение об ошибке, в котором говорится, чтоstring
это не слот класса.
r$> new("myClass", string = "my string")
Error in initialize(value, ...) :
invalid name for slot of class “myClass”: string
Конечно, я могу создать явный конструктор дляmyClass
, оберните в него логику и передайте последнюю строку в слот (это может быть лучшей практикой, и это то, что я делаю в данный момент):
myClass <- function(string) {
new("myClass", myString = paste0("My string is ", string))
}
но я не понимаю, почему он не работает сinitialize
метод.