其他对象

[[[ 运算符是通用的原始函数。这意味着 R 中的任何对象 (特别是 isTRUE(is.object(x)) –ie 具有明确的 class 属性)在子集化时可以具有自己的指定行为; 即有自己的方法[ 和/或 [[

例如,这是“data.frame”(is.object(iris))对象的情况,其中定义了 [.data.frame[[.data.frame 方法,并使它们表现出类似矩阵列表的子集。在对“data.frame”进行子集化时强制出错,我们看到,实际上,当我们使用 [ 时,函数 [.data.frame 被调用了。

iris[invalidArgument, ]
## Error in `[.data.frame`(iris, invalidArgument, ) : 
##   object 'invalidArgument' not found

如果没有关于当前主题的更多细节,可以使用 example[ 方法:

x = structure(1:5, class = "myClass")
x[c(3, 2, 4)]
## [1] 3 2 4
'[.myClass' = function(x, i) cat(sprintf("We'd expect '%s[%s]' to be returned but this a custom `[` method and should have a `?[.myClass` help page for its behaviour\n", deparse(substitute(x)), deparse(substitute(i))))

x[c(3, 2, 4)]
## We'd expect 'x[c(3, 2, 4)]' to be returned but this a custom `[` method and should have a `?[.myClass` help page for its behaviour
## NULL

我们可以通过使用等效的非通用 .subset(和 .subset2 用于 [[)来克服 [ 的方法调度。在编写我们自己的时,这是非常有用和高效的,并且当我们有效地计算我们的时避免使用解决方法(如 unclass(x))(避免方法调度和复制对象):

.subset(x, c(3, 2, 4))
## [1] 3 2 4