Я определил два класса, которые могут успешно добавлять два своих объекта или число и один свой объект.
a <- structure(list(val = 1), class = 'customClass1')
b <- structure(list(val = 1), class = 'customClass2')
`+.customClass1` <- function(e1, e2, ...){
val1 <- ifelse(is.numeric(e1), e1, e1$val)
val2 <- ifelse(is.numeric(e2), e2, e2$val)
val_res <- val1 + val2
print('customClass1')
return(structure(list(val = val_res), class = 'customClass1'))
}
`+.customClass2` <- function(e1, e2, ...){
val1 <- ifelse(is.numeric(e1), e1, e1$val)
val2 <- ifelse(is.numeric(e2), e2, e2$val)
val_res <- val1 + val2
print('customClass2')
return(structure(list(val = val_res), class = 'customClass1'))
}
print.customClass1 <- function(x, ...){
print(x$val)
}
print.customClass2 <- function(x, ...){
print(x$val)
}
a + a
# [1] 2
a + 1
# [1] 2
b + b
# [1] 2
1 + b
# [1] 2
Но очевидно, что что-то пойдет не так, когда я попытаюсь добавить два пользовательских класса.
a + b
# Error in a + b : non-numeric argument to binary operator
# In addition: Warning message:
# Incompatible methods ("+.customClass1", "+.customClass2") for "+"
Я мог бы определить только одну функцию для customClass1, но тогда эта функция не работала бы, когда я пытался добавить два объекта customClass2. Есть ли способ установить приоритет одной функции над другой?
Кажется, что R делает это естественным образом, отдавая приоритет моим функциям над базовыми функциями (например, числового или целочисленного типа). Когда один из обоих аргументов имеет тип customClass, R автоматически перенаправляет его в мою функцию вместо функции по умолчанию.