其他物件

[[[ 運算子是通用的原始函式。這意味著 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