【问题标题】:Define an S3 method for a generic class [duplicate]为泛型类定义 S3 方法 [重复]
【发布时间】:2019-04-20 23:53:26
【问题描述】:

我想创建一个+ 方法来粘贴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"

然后它确实有效。

【问题讨论】:

  • 我对此表示怀疑,所有 S4 Arith 泛型都为 e1 = character, e2 = character 密封

标签: r r-s3


【解决方案1】:

看来您需要将变量的类定义为“字符”。这正是你所做的!除了一件事……我也不知道……

这是一个例子:

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

在使用你的功能时:

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

所以看来得定义变量的属性类了。

【讨论】:

  • 这可能不完全是这样,我只是用一个例子编辑了答案。
猜你喜欢
  • 2017-11-13
  • 2019-08-26
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多