【发布时间】:2018-04-10 02:31:19
【问题描述】:
我是从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()
}
}
【问题讨论】:
-
[是子集运算符。[.blob是新的blob对象的子集化方法。因此,.以标准 s3 方法调度方式使用(正如您在问题中指出的那样) -
特殊符号(例如,反引号、方括号、百分号、名称中带空格的变量)默认不能“分配给”。为此,如果您将其用反引号括起来,它就可以工作。例如,一个名为
A B的变量不能用A B <- 1赋值,而`A B` <- 1有效。 -
[[<-.blob函数用于为新的blob对象覆盖[[<-s3 方法。 “正常”的基本 R 示例是myvec <- c(1:5); myvec[[3]] <- 2 -
你也可以用反引号调用函数,例如
`[`(letters, 4)会给你第4个字母,相当于letters[4]。 -
您可以使用反引号做一些事情,包括:使用标准语法调用中缀运算符(例如
iris[['Species']]或`[[`(iris, 'Species'))或引用具有非法(? ) 字符,例如如果dat的列被命名为"0 bad column name",您可以说dat$`0 bad column name`,但不能说dat$0 bad column name。我还想其他几件事?