Как использовать функцию замены для 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"