Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R S3类的方括号是什么?_R_R S3 - Fatal编程技术网

R S3类的方括号是什么?

R S3类的方括号是什么?,r,r-s3,R,R S3,这是我从你那里得到的。这显示了S3类的泛型和方法的编写。但我不理解这些功能所分配的符号或约定。以下是我的问题: 使用backticks`来定义函数名。通常我们不会使用反勾号甚至双引号来分配变量/函数,但我经常看到这种情况。这是命名约定吗 为什么在blob名称之前包含?通常情况下,它不只是被称为blob,方法是method.blob吗 为什么会有括号?特别是,[摘要] 如果要在R中创建一个新对象,并希望其具有“不同”的子集和赋值行为,则应为这些操作创建关联的方法 正在以您期望的方式工作-方法分

这是我从你那里得到的。这显示了S3类的泛型和方法的编写。但我不理解这些功能所分配的符号或约定。以下是我的问题:

  • 使用backticks
    `
    来定义函数名。通常我们不会使用反勾号甚至双引号来分配变量/函数,但我经常看到这种情况。这是命名约定吗
  • 为什么在blob名称之前包含
    ?通常情况下,它不只是被称为blob,方法是method.blob吗
  • 为什么会有括号?特别是,
    [摘要]
    如果要在R中创建一个新对象,并希望其具有“不同”的子集和赋值行为,则应为这些操作创建关联的方法

    • 正在以您期望的方式工作-方法分派

    • [.blob
      正在重写S3
      [
      子集运算符


    • [
      [
      是子集运算符。
      [.blob
      是一种对新的
      blob
      对象进行子集设置的方法。因此,
      以标准的s3方法分派方式使用(正如您在问题中指出的那样),不能使用特殊符号(例如,回号、括号、百分号、名称中带空格的变量)默认情况下为“assigned to”。要这样做,如果用倒勾将其包围,则它可以工作。例如,名为
      ab
      的变量不能用
      ab
      [[您也可以用倒勾调用函数,例如
      `[`(字母,4)
      将给您第四个字母,它相当于
      字母[4]
      。您可以使用backticks做一些事情,包括:使用标准语法调用中缀运算符(例如
      iris[['Species']]
      `[`(iris,'Species')
      )或引用具有非法(?)字符的变量/列名,例如,如果
      dat
      的列被命名为
      “0错误列名”“
      ,你可以说
      dat$`0坏列名`
      ,但不能说
      dat$0坏列名
      。我还想说几件事?
      #' @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()
        }
      }
      
      ## 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()
      
      blob[3]
      # [1] 3
      
      ## define the function to always subset the first element
      `[.blob` <- function(x, i, j, ...) { i = 1; NextMethod() }
      
      blob[1]
      # [1] 1
      blob[2]
      # [1] 1
      blob[3]
      # [1] 1
      
      `[<-.blob` <- function(x, i, j, ...) { i = 5; NextMethod() }
      
      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