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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。