Как использовать функцию замены для setAs() в R?

Я пытаюсь определить метод принуждения в R, включая функцию замены. К сожалению, ни документация, ни дальнейшие обсуждения в Интернете не разъясняют, как использовать замену параметра в этой функции.

Моя цель - заставить метод принуждения работать одинаково в этих двух командах:

      obj <- as(obj, "to-class")
as(obj) <- "to-class"

Например, я установил метод для приведения класса «таблица» к «data.frame», включая функцию для метода замены:

      setAs(from = "table", to = "data.frame",
    def = function(from) {
      return(as.data.frame(from))
    },
    replace = function(from, value) {
      from <- as(from, value)
      return(from)
    })

Теперь метод в действии

      data(Titanic)
x <- Titanic

# two coerce alternatives
y <- as(x, "data.frame")
as(x) <- "data.frame"

В то время как первый работает отлично, второй возвращает мне ошибку:

Error in .identC(.class1(value), Class) :
argument "Class" is missing, with no default

Я делаю что-то не так или, может быть, слишком многого ожидаю отsetAs()?

2 ответа

replaceне делает то, что вы думаете. Он существует, чтобы разрешить прямое присвоение непринудительного объекта принудительной версии. Вторым аргументом должно быть не имя класса, а непринудительный объект.

Чтобы взять вашу таблицу/data.frame приведение, мы могли бы написать.

      setAs(from = "table", to = "data.frame",
      def = function(from) {
        return(as.data.frame(from))
      },
      replace = function(from, value) {
        from <- as.data.frame(value)
        return(from)
      })

Итак, если у нас есть таблица с именемx

      x <- table(iris$Species)
x

#> setosa versicolor  virginica 
#>     50         50         50 

Мы можем назначить данные другой таблицы и принудить к data.frame за один раз, выполнив:

      as(x, "data.frame") <- table(mtcars$cyl)
x
#>   Var1 Freq
#> 1    4   11
#> 2    6    7
#> 3    8   14

По сути, это то же самое, что писать

      x <- as(table(mtcars$cyl), "data.frame")

и, следовательно, имеет ограниченную полезность, возможно, поэтому документация скудна.

Пока я до сих пор не знаю, какой параметр заменить вsetAs()хорошо, я решил проблему определения метода дляas()<-:

      # Defining 'as()'
setAs(from = "table", to = "data.frame",
    def = function(from) {
      return(as.data.frame(from))
    })

# Defining 'as()<-'
setReplaceMethod("as", signature(object = "table", Class = "missing",
        value = "character"), 
    function(object, Class, value) {
      object <- as(object, value)
      return(object)
    })

Хорошая вещь в этом решении, метод замены будет применяться для любого принуждения, определенного с помощьюfrom = "table"

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