我想创建一个+
粘贴character
对象的方法。一种可能的方法是使用中缀运算符:
`%+%` <- function(x, y) paste0(x, y)
"a" %+% "b" # returns "ab"
但是,我想知道是否可以用 S3 方法做同样的事情。您可以通过创建一个新类来做到这一点,比如说char
,然后执行以下操作:
# Create a function to coerce to class 'char'
as.char <- function(x, ...) structure(as.character(x, ...), class = "char")
# S3 method to paste 'char' objects
"+.char" <- function(x, y) paste0(x, y)
a <- as.char("a")
b <- as.char("b")
c(class(a), class(b)) # [1] "char" "char"
a + b # returns "ab"
但是,如果您尝试创建一个+.character
方法,它就不起作用:
"+.character" <- function(x, y) paste0(x, y)
a <- "a"
b <- "b"
c(class(a), class(b)) # [1] "character" "character"
a + b # Error in a + b : non-numeric argument to binary operator
但是,如果您character
手动分配类,它确实有效:
as.character_ <- function(x, ...) structure(as.character(x, ...), class = "character")
a <- as.character_("a")
b <- as.character_("b")
c(class(a), class(b)) # [1] "character" "character"
a + b # returns "ab"
所以我只是想知道我在这里缺少什么,以及是否可以为泛型类实际定义 S3 方法。
编辑:根据@Csd
答案,尚不清楚这是由于属性造成的,因为如果您定义自己的函数,例如:
concat <- function(e1, e2) UseMethod("concat")
concat.character <- function(e1, e2) paste0(e1, e2)
concat("a", "b") # returns "ab"
然后它确实有效。