> foo <- structure(list(one=1,two=2), class = "foo")
> cat(foo)
Error in cat(list(...), file, sep, fill, labels, append) :
argument 1 (type 'list') cannot be handled by 'cat'
好的我会将它添加到通用猫:
> cat.foo<-function(x){cat(foo$one,foo$two)}
> cat(foo)
Error in cat(list(...), file, sep, fill, labels, append) :
argument 1 (type 'list') cannot be handled by 'cat'
没有骰子。
答案 0 :(得分:3)
你做不到。 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
答案 1 :(得分:2)
如果您的帖子中的示例是您实际尝试实现的内容,而不仅仅是解释您的观点的一些玩具示例,您只需重新定义cat
以所需方式处理list
:
cat <- function(...) do.call(base::cat, as.list(do.call(c, list(...))))
R> cat(list(1,2))
1 2R> cat(list(1,2), sep=',')
1,2R> cat(c(1,2))
1 2R> cat(c(1,2), sep=',')
1,2R>