Вы не можете. cat()
не является общей функцией, поэтому вы не можете писать для нее методы.
Вы могли бы сделать новую версию cat()
, что является общим:
cat <- function(..., file = "", sep = " ", fill = FALSE, labels = NULL,
append = FALSE) {
UseMethod("cat")
}
cat.default <- function(..., file = "", sep = " ", fill = FALSE, labels = NULL,
append = FALSE) {
base::cat(..., file = file, sep = sep, fill = fill, labels = labels,
append = append)
}
Но семантику диспетчерских на ...
не определена (я не мог найти, где, если где-нибудь, это документально). Похоже, отправка происходит только на основе первого элемента в ...
:
cat.integer <- function(...) "int"
cat.character <- function(...) "chr"
cat(1L)
#> [1] "int"
cat("a")
#> [1] "chr"
Это означает, что класс второй и все последующие аргументы игнорируются:
cat(1L, "a")
#> [1] "int"
cat("a", 1L)
#> [1] "chr"
Если вы хотите добавить foo
метод cat()
, вам просто нужно немного дополнительной проверки:
cat.foo <- function(..., file = "", sep = " ", fill = FALSE, labels = NULL,
append = FALSE) {
dots <- list(...)
if (length(dots) > 1) {
stop("Can only cat one foo at a time")
}
foo <- dots[[1]]
cat(foo$one, foo$two, file = file, sep = sep, fill = fill, labels = labels,
append = append)
cat("\n")
}
foo <- structure(list(one=1,two=2), class = "foo")
cat(foo)
#> 1 2
Просто писать новую функцию с именем формы function.class Безразлично Вообще-то, если функция не была общей, в первую очередь. С этим я сказал, что еще не пробовал, но у меня есть ощущение, что у кошки есть ... поскольку его первый параметр может вызвать некоторые осложнения. – Dason
Есть ли что-то явно неправильное с вызовом cat.foo напрямую? 'cat.foo (foo)' – Dason
- это краткое решение для определения 'print.foo'. – agstudy