Extract
位於 base
包(package)。 說明
作用於向量、矩陣、數組和列表以提取或替換部分的運算符。
用法
x[i]
x[i, j, ... , drop = TRUE]
x[[i, exact = TRUE]]
x[[i, j, ..., exact = TRUE]]
x$name
getElement(object, name)
x[i] <- value
x[i, j, ...] <- value
x[[i]] <- value
x$name <- value
參數
x , object |
從中提取元素或替換元素的對象。 |
i , j , ... |
指定要提取或替換的元素的索引。索引是 僅適用於 當通過
|
name |
文字字符串或name(可能是backtick 引用)。對於提取,這通常(參見“環境”下)與對象的 |
drop |
對於矩陣和數組。如果 |
exact |
通過字符向量提取時控製 |
value |
通常是類似數組的R類似類的對象 |
細節
這些運算符是通用的。您可以編寫方法來處理特定對象類的索引,請參閱 InternalMethods 以及 [.data.frame
和 [.factor
。此處的說明僅適用於默認方法。請注意,當索引發生在表達式的賦值端時,替換函數 [<-
、 [[<-
和 $<-
需要使用單獨的方法。
[
、 [[
和 $
之間最重要的區別是 [
可以選擇多個元素,而其他兩個則選擇單個元素。
請注意,x[[]]
始終是錯誤的。
對於原子向量、矩陣/數組和遞歸(list-like,請參閱is.recursive
)對象,默認方法的用法方式略有不同。 $
僅對遞歸對象(和 NULL
)有效,並且僅在下麵有關遞歸對象的部分中討論。
子集化(空索引除外)將刪除除 names
、 dim
和 dimnames
之外的所有屬性。
索引可以出現在表達式的右側以進行提取,也可以出現在左側以進行替換。當索引表達式出現在賦值的左側(稱為子賦值)時,x
的該部分將設置為賦值右側的值。在這種情況下,不會進行字符索引的部分匹配,並且根據需要強製左側接受值。對於向量,答案將是層次結構中原始 < 邏輯 < 整數 < 雙精度 < 複雜 < 字符 < 列表 < 表達式中 x
和 value
類型中較高的類型。屬性被保留(盡管 names
、 dim
和 dimnames
將進行適當調整)。子分配是按順序完成的,因此如果多次指定索引,則會生成索引的最新分配值。
將這些運算符中的任何一個應用於不可子集化的對象(例如函數)都是錯誤的。
原子載體
索引的常見形式是 [
。 [[
可用於選擇刪除 names
的單個元素,而 [
保留它們,例如在 c(abc = 123)[1]
中。
索引對象i
可以是數字、邏輯、字符或空。允許按因子進行索引,這相當於按數字代碼進行索引(請參閱 factor
),而不是按打印的字符值進行索引(為此使用 [as.character(i)]
)。
空索引選擇所有值:這最常用於替換所有條目,但保留 attributes
。
矩陣和數組
矩陣和數組是具有維度屬性的向量,因此所有索引向量形式都可以與單個索引一起使用。結果將是一個未命名的向量,除非 x
是一維的,而它是一個一維數組。
對 [
。對於向量索引,索引可以是數字、邏輯、字符、空甚至因子。同樣,按因子索引相當於按數字代碼索引,請參閱上麵的“原子向量”。 維數組進行索引的最常見形式是將 索引指定為
空索引(逗號分隔的空白)表示選擇該維度中的所有條目。參數 drop
適用於這種形式的索引。
索引的第三種形式是通過每個維度有一列的數字矩陣:然後索引矩陣的每一行選擇數組的單個元素,結果是一個向量。索引矩陣中不允許有負索引。允許 NA
和零值:索引矩陣中包含零的行將被忽略,而包含 NA
的行會在結果中生成 NA
。
如果數組具有維度名稱,則還支持通過每個維度一列的字符矩陣進行索引。與數字矩陣索引一樣,索引矩陣的每一行選擇數組的單個元素。索引與適當的維度名稱進行匹配。允許NA
,並將在結果中生成NA
。不允許使用不匹配的索引以及空字符串 (""
),這將導致錯誤。
通過矩陣索引獲得的向量將是未命名的,除非 x
是一維的,此時行名稱(如果有)將被索引以提供結果名稱。
遞歸 (list-like) 對象
[
索引類似於原子向量,並選擇指定元素的列表。
[[
和 $
都選擇列表中的單個元素。主要區別在於 $
不允許計算索引,而 [[
允許。 x$name
相當於 x[["name", exact = FALSE]]
。此外,[[
的部分匹配行為可以使用exact
參數進行控製。
getElement(x, name)
是 x[[name, exact = TRUE]]
的一個版本,對於正式分類 (S4) 的對象,它返回 slot(x, name)
,因此提供對更通用的 list-like 對象的訪問。
[
和 [[
有時應用於其他遞歸對象,例如 call 和 expression 。配對列表(例如調用)被 [
強製轉換為列表以進行提取,但所有三個運算符都可以用於替換。
[[
可以遞歸地應用於列表,因此,如果單個索引 i
是長度為 p
的向量,則 alist[[i]]
相當於 alist[[i1]]...[[ip]]
提供列表中除最終索引結果之外的所有結果。
請注意,在所有三種替換中,值 NULL
都會刪除列表中的相應項目。要將條目設置為 NULL
,您需要 x[i] <- list(NULL)
。
什麽時候$<-
被應用到一個NULL
x
,它首先強製x
到list()
。這也是發生的情況[[<-
在哪裏R版本小於 4.y.z,長度為 1 值導致長度為 1(原子)向量.
環境
$
和 [[
都可以應用於環境。僅允許字符索引,並且不進行部分匹配。這些操作的語義是 get(i, env = x,
inherits = FALSE)
的語義。如果未找到匹配項,則返回 NULL
。也可以使用替換版本 $<-
和 [[<-
。同樣,隻允許字符參數。本例中的語義是 assign(i, value, env = x,
inherits = FALSE)
的語義。此類分配將創建新綁定或更改 x
中的現有綁定。
索引中的 NA
提取時,數字、邏輯或字符 NA
索引選取未知元素,因此在邏輯、整數、數字、複數或字符結果的相應元素中返回 NA
,並在列表中返回 NULL
。 (它返回 00
作為原始結果。)
替換時(即在賦值的左側使用索引)NA
不會選擇任何要替換的元素。由於是否應使用 rhs 的元素存在歧義,因此僅當 rhs 值的長度為 1 時才允許這樣做(因此兩種解釋將具有相同的結果)。 (S 的記錄行為是 NA
替換索引“無處可去”,但耗盡了 value
的一個元素:Becker 等人,第 359 頁。但是,其他實現並非如此。)
參數匹配
請注意,這些操作並不以標準方式匹配其索引參數:忽略參數名稱,僅使用位置匹配。因此 m[j = 2, i = 1]
相當於 m[2, 1]
而不是 m[1, 2]
。
對於為它們定義的方法來說,情況可能並非如此;例如,對於 [.data.frame
中說明的 data.frame
方法來說,情況並非如此,如果 i
或 j
被命名並且在這種情況下具有未記錄的行為,則會發出警告。
為避免混淆,請勿命名索引參數(但必須命名 drop
和 exact
)。
S4方法
這些運算符也是隱式 S4 泛型,但作為原語,S4 方法將僅在 S4 對象 x
上分派。
$
和 $<-
運算符的隱式泛型的簽名中沒有 name
,因為語法隻允許 name
參數使用符號或字符串常量。
字符索引
在某些情況下,字符索引可以部分匹配(請參閱pmatch
) 到被子集化的對象的名稱或暗名稱(但絕不用於子分配)。與 S(貝克爾等人p。 358),R提取時從不使用部分匹配[
,並且默認情況下不使用部分匹配[[
(參見論證exact
)。
因此,默認行為是僅在通過 $
從遞歸對象(環境除外)中提取時才使用部分匹配。即使在這種情況下,也可以通過 options(warnPartialMatchDollar = TRUE)
打開警告。
空索引 ( ""
) 和 NA
索引都不匹配任何名稱,甚至不匹配空名稱或缺失名稱。如果任何對象沒有名稱或適當的暗名稱,它們將被視為全部""
,因此不匹配。
錯誤情況
嘗試對不可能執行此操作的對象應用子集化操作會發出 notSubsettableError
類錯誤。錯誤條件的 object
組件包含不可子集化的對象。
下標越界錯誤被標記為 subscriptOutOfBoundsError
類錯誤。錯誤條件的 object
組件包含正在被子集化的對象。對於向量下標,整數 subscript
分量為零,對於多個下標,指示哪個下標超出範圍。 index
組件包含錯誤的索引。
例子
x <- 1:12
m <- matrix(1:6, nrow = 2, dimnames = list(c("a", "b"), LETTERS[1:3]))
li <- list(pi = pi, e = exp(1))
x[10] # the tenth element of x
x <- x[-1] # delete the 1st element of x
m[1,] # the first row of matrix m
m[1, , drop = FALSE] # is a 1-row matrix
m[,c(TRUE,FALSE,TRUE)]# logical indexing
m[cbind(c(1,2,1),3:1)]# matrix numeric index
ci <- cbind(c("a", "b", "a"), c("A", "C", "B"))
m[ci] # matrix character index
m <- m[,-1] # delete the first column of m
li[[1]] # the first element of list li
y <- list(1, 2, a = 4, 5)
y[c(3, 4)] # a list containing elements 3 and 4 of y
y$a # the element of y named a
## non-integer indices are truncated:
(i <- 3.999999999) # "4" is printed
(1:5)[i] # 3
## named atomic vectors, compare "[" and "[[" :
nx <- c(Abc = 123, pi = pi)
nx[1] ; nx["pi"] # keeps names, whereas "[[" does not:
nx[[1]] ; nx[["pi"]]
## recursive indexing into lists
z <- list(a = list(b = 9, c = "hello"), d = 1:5)
unlist(z)
z[[c(1, 2)]]
z[[c(1, 2, 1)]] # both "hello"
z[[c("a", "b")]] <- "new"
unlist(z)
## check $ and [[ for environments
e1 <- new.env()
e1$a <- 10
e1[["a"]]
e1[["b"]] <- 20
e1$b
ls(e1)
## partial matching - possibly with warning :
stopifnot(identical(li$p, pi))
op <- options(warnPartialMatchDollar = TRUE)
stopifnot( identical(li$p, pi), #-- a warning
inherits(tryCatch (li$p, warning = identity), "warning"))
## revert the warning option:
options(op)
參考
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.
也可以看看
names
用於名稱匹配的詳細信息,pmatch
用於部分匹配。
[.data.frame
和 [.factor
適用於 data.frame 和因子時的行為。
Syntax
用於運算符優先級,以及有關索引詳細信息的“R 語言定義”手冊。
NULL
了解索引空對象的詳細信息。
相關用法
- R Extract.factor 提取或替換部分因子
- R Extract.data.frame 提取或替換 DataFrame 的部分內容
- R Extremes 最大值和最小值
- R Encoding 讀取或設置字符向量聲明的編碼
- R file.path 構造文件路徑
- R grep 模式匹配和替換
- R getwd 獲取或設置工作目錄
- R vector 向量 - 創建、強製等
- R lapply 對列表或向量應用函數
- R dump R 對象的文本表示
- R Sys.getenv 獲取環境變量
- R rank 樣本排名
- R getDLLRegisteredRoutines DLL 中 C/Fortran 例程的反射信息
- R pushBack 將文本推回連接
- R strsplit 分割字符向量的元素
- R seq.Date 生成規則的日期序列
- R invisible 將打印模式更改為不可見
- R noquote “無引號”字符串打印類
- R warning 警告信息
- R rapply 遞歸地將函數應用於列表
- R basename 操作文件路徑
- R with 評估數據環境中的表達式
- R formals 訪問和操縱形式參數
- R icuSetCollate 按 ICU 設置整理
- R search 給出 R 對象的搜索路徑
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Extract or Replace Parts of an Object。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。