Отправка `: =` по второму аргументу - PullRequest
1 голос
/ 28 января 2020

Я хотел бы реализовать функцию :=(lhs, rhs), которая принимает любое выражение для lhs, тогда как rhs должно быть класса X.

. чтобы избежать конфликтов с другими пакетами (например, data.table), через setGeneric(":=") должна быть настроена обобщенная c функция :=, которая отправляет данные на основе класса второго аргумента.

Однако

setMethod(
  ":="
  , c("ANY", "X")
  , function(lhs, rhs) NULL
)

предполагает, что первый аргумент является фактическим объектом, то есть bla := x приводит к

Ошибка в := (bla, x): объект 'bla' не найден

всякий раз, когда bla не связан.

Есть ли способ определить такую ​​функцию, не влияя на поведение других реализаций с тем же именем, когда второй аргумент класса X?

Примечание: := не может быть определен как соответствующий S3 generi c, поскольку он отправляется в lhs вместо rhs.

1 Ответ

0 голосов
/ 28 января 2020

вам нужно сказать signature("ANY","X") вместо вектора

setGeneric(":=", function(lhs,rhs) standardGeneric(":="))
setMethod(":=", signature("ANY","ANY"), function(lhs,rhs){print("Default")})
setMethod(":=", signature("ANY","foo"), function(lhs,rhs){print("foo Method")})

bla <- 1:10
bar <- 1:10
class(bar) <- "foo"

bla:=bla
#Default
bla:=bar
#foo Method
...