S3类的这些方括号是什么?

时间:2018-04-10 02:31:19

标签: r r-s3

我是从an open source repo on git获得的。这显示了S3类的泛型和方法的编写。但我不明白函数被赋予的符号或约定。以下是我的问题:

  • 使用反引号``来定义函数名称。通常我们不会使用反引号甚至双引号来分配变量/函数,但我发现这种情况很多次。这是一个命名惯例吗?
  • 为什么blob名称前面包含.?通常它不会被称为blob,方法是method.blob?
  • 为什么那里有[个括号?特别是[<-[[<-。我们正在进行某种双重签名吗?

希望有人能够了解ha是什么

#' @export
 `[.blob`  <- function(x, i, ...) {
  new_blob(NextMethod())
}

#' @export
`[<-.blob` <- function(x, i, ..., value) {
  if (!is_raw_list(value)) {
    stop("RHS must be list of raw vectors", call. = FALSE)
  }

  NextMethod()
}

#' @export
 `[[<-.blob` <- function(x, i, ..., value) {
  if (!is.raw(value) && !is.null(value)) {
    stop("RHS must be raw vector or NULL", call. = FALSE)
  }

  if (is.null(value)) {
    x[i] <- list(NULL)
    x
  } else {
    NextMethod()
  }
}

1 个答案:

答案 0 :(得分:5)

摘要

如果您要在R中创建一个您想要“不同”子集和赋值行为的新对象,则应为这些操作创建关联方法。

  • . IS以您期望的方式工作 - 方法调度

  • [.blob正在覆盖S3 [子集运算符

  • [<-.blob覆盖了S3 [<-运算符(即向量子集分配)

  • [[<-.blob覆盖S3 [[<-运算符(即列表子集分配)

  • 默认情况下,不能“分配”特殊符号(例如,反引号,括号,百分号,名称中带空格的变量)。要做到这一点,如果你用反引号包围它,它可以工作。例如,名为A B的变量不能与A B <- 1一起分配,而`A B` <- 1可以分配{credit @ r2evans

实施例

子集

[.blob为例,这允许您为blob对象创建自己的子集操作。

## Create your own blob object (class)
blob <- 1:5
attr(blob, "class") <- "blob"

## create a subset operator, which in this example just calls the next method in the s3 dispatch chain 
`[.blob` <- function(x, i, j, ...) NextMethod()

由于我们在自己的子集方法中没有做任何特殊的事情,这就像普通的R矢量

一样
blob[3]
# [1] 3

但是,我们可以使子集操作做任何我们想做的事情,例如总是返回向量的第一个元素

## define the function to always subset the first element
`[.blob` <- function(x, i, j, ...) { i = 1; NextMethod() }

现在,您的blob对象将只返回第一个元素。

blob[1]
# [1] 1
blob[2]
# [1] 1
blob[3]
# [1] 1

分配

对于其中一个赋值运算符,如果使用

重载[<-
`[<-.blob` <- function(x, i, j, ...) { i = 5; NextMethod() }

这将始终使用新值

指定blob对象的第5个元素
blob[1] <- 100
blob
# [1]   1   2   3   4 100
# attr(,"class")
# [1] "blob"

返回标记

使用反向标记,以便我们可以将函数/变量分配给特殊符号。

例如,尝试将矢量指定给[符号

[ <- 1:5
# Error: unexpected '[' in "["

然而用它来围绕它会让它通过(虽然不推荐这个例子)

`[` <- 1:5
`[`
# [1] 1 2 3 4 5