其他对象
[
和 [[
运算符是通用的原始函数。这意味着 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