我从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()
}
}
Run Code Online (Sandbox Code Playgroud)
如果您要在R中创建一个您想要"不同"子集和赋值行为的新对象,则应为这些操作创建关联方法.
该.工作在你期待的方式-方法分派
[.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()
Run Code Online (Sandbox Code Playgroud)
因为我们在自己的子集方法中没有做任何特殊的事情,所以它就像普通的R向量一样
blob[3]
# [1] 3
Run Code Online (Sandbox Code Playgroud)
但是,我们可以使子集操作做任何我们想做的事情,例如总是返回向量的第一个元素
## define the function to always subset the first element
`[.blob` <- function(x, i, j, ...) { i = 1; NextMethod() }
Run Code Online (Sandbox Code Playgroud)
现在你的blob对象只返回第一个元素.
blob[1]
# [1] 1
blob[2]
# [1] 1
blob[3]
# [1] 1
Run Code Online (Sandbox Code Playgroud)
同样赋值运算符的一个,如果你超载[<-与
`[<-.blob` <- function(x, i, j, ...) { i = 5; NextMethod() }
Run Code Online (Sandbox Code Playgroud)
这将始终使用新值分配blob对象的第5个元素
blob[1] <- 100
blob
# [1] 1 2 3 4 100
# attr(,"class")
# [1] "blob"
Run Code Online (Sandbox Code Playgroud)
使用反向标记,以便我们可以将函数/变量分配给特殊符号.
例如,尝试为[符号指定矢量
[ <- 1:5
# Error: unexpected '[' in "["
Run Code Online (Sandbox Code Playgroud)
而用它来围绕它会让它通过(尽管不推荐这个例子)
`[` <- 1:5
`[`
# [1] 1 2 3 4 5
Run Code Online (Sandbox Code Playgroud)