为泛型类定义S3方法

时间:2018-11-18 12:19:39

标签: r r-s3

我想创建一个+方法来粘贴character对象。一种可能的方法是使用infix运算符:

`%+%` <- 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"

然后它可以工作。

1 个答案:

答案 0 :(得分:1)

似乎您需要将变量的类定义为“字符”。那就是你要做的!除了一件事...我也不知道...

这里是一个例子:

a <- "a"
class(a) # "character"
attributes(a) # NULL!!!

使用功能时

a <- as.character_("a")
class(a) # "character"
attributes(a) # "class" is "character"

因此,似乎必须定义该变量的属性类。