Неслотовые параметры в методах инициализации для объектов 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метод.

0 ответов

Другие вопросы по тегам