pluck()
实现了 [[
的通用形式,允许您深入、灵活地索引数据结构。它总是成功,如果您尝试访问的索引不存在或者是 NULL
,则返回 .default
。
pluck<-()
是等效的赋值,允许您修改嵌套数据结构深处的对象。
pluck_exists()
使用与 pluck 相同的规则告诉您对象是否存在(即 NULL
元素相当于不存在的元素)。
参数
- .x, x
-
向量或环境
- ...
-
用于索引对象的访问器列表。可以是正整数、负整数(从右侧索引)、字符串(从名称中索引)或访问器函数(仅支持名称和位置的赋值变体除外)。如果正在索引的对象是 S4 对象,则按名称访问它将返回相应的槽。
支持Dynamic dots。特别是,如果您的访问器存储在列表中,您可以将其与
!!!
拼接。 - .default
-
如果目标是
NULL
或不存在,则使用的值。 - value
-
要在
.x
中的拔取位置替换的值。使用zap()
来删除该元素。
细节
-
您可以使用标准访问器(例如整数位置和字符串名称)进行拔取或卡盘,并且还接受任意访问器函数,即获取对象并返回某些内部片段的函数。
这通常比运算符和访问器的组合更具可读性,因为它线性读取并且没有语法缺陷。比较:
accessor(x[[1]])$foo
与pluck(x, 1, accessor, "foo")
。 -
这些访问器从不partial-match。这与
$
不同,如果您编写mtcars$di
,$
将选择disp
对象。
也可以看看
attr_getter()
用于创建适合与 pluck()
和 chuck()
一起使用的属性获取器。 modify_in()
用于将函数应用于拾取位置。
例子
# Let's create a list of data structures:
obj1 <- list("a", list(1, elt = "foo"))
obj2 <- list("b", list(2, elt = "bar"))
x <- list(obj1, obj2)
# pluck() provides a way of retrieving objects from such data
# structures using a combination of numeric positions, vector or
# list names, and accessor functions.
# Numeric positions index into the list by position, just like `[[`:
pluck(x, 1)
#> [[1]]
#> [1] "a"
#>
#> [[2]]
#> [[2]][[1]]
#> [1] 1
#>
#> [[2]]$elt
#> [1] "foo"
#>
#>
# same as x[[1]]
# Index from the back
pluck(x, -1)
#> [[1]]
#> [1] "b"
#>
#> [[2]]
#> [[2]][[1]]
#> [1] 2
#>
#> [[2]]$elt
#> [1] "bar"
#>
#>
# same as x[[2]]
pluck(x, 1, 2)
#> [[1]]
#> [1] 1
#>
#> $elt
#> [1] "foo"
#>
# same as x[[1]][[2]]
# Supply names to index into named vectors:
pluck(x, 1, 2, "elt")
#> [1] "foo"
# same as x[[1]][[2]][["elt"]]
# By default, pluck() consistently returns `NULL` when an element
# does not exist:
pluck(x, 10)
#> NULL
try(x[[10]])
#> Error in x[[10]] : subscript out of bounds
# You can also supply a default value for non-existing elements:
pluck(x, 10, .default = NA)
#> [1] NA
# The map() functions use pluck() by default to retrieve multiple
# values from a list:
map_chr(x, 1)
#> [1] "a" "b"
map_int(x, c(2, 1))
#> [1] 1 2
# pluck() also supports accessor functions:
my_element <- function(x) x[[2]]$elt
pluck(x, 1, my_element)
#> [1] "foo"
pluck(x, 2, my_element)
#> [1] "bar"
# Even for this simple data structure, this is more readable than
# the alternative form because it requires you to read both from
# right-to-left and from left-to-right in different parts of the
# expression:
my_element(x[[1]])
#> [1] "foo"
# If you have a list of accessors, you can splice those in with `!!!`:
idx <- list(1, my_element)
pluck(x, !!!idx)
#> [1] "foo"
相关用法
- R purrr pluck_depth 计算向量的深度
- R purrr pmap 同时映射多个输入(“并行”)
- R purrr possibly 包装函数以返回值而不是错误
- R purrr partial 部分应用函数,填充一些参数
- R purrr accumulate 累积向量缩减的中间结果
- R purrr imap 将函数应用于向量的每个元素及其索引
- R purrr list_transpose 转置列表
- R purrr as_vector 将列表强制转换为向量
- R purrr map_if 有条件地将函数应用于向量的每个元素
- R purrr map2 映射两个输入
- R purrr array-coercion 强制数组列出
- R purrr auto_browse 包装一个函数,以便在出错时自动 browser()
- R purrr insistently 将函数转换为等待,然后在错误后重试
- R purrr map_depth 在给定深度映射/修改元素
- R purrr list_simplify 将列表简化为原子或 S3 向量
- R purrr rerun 多次重新运行表达式
- R purrr quietly 包装一个函数来捕获副作用
- R purrr list_flatten 压平列表
- R purrr head_while 查找全部满足谓词的头/尾。
- R purrr rbernoulli 从伯努利分布生成随机样本
- R purrr rate-helpers 创建延迟率设置
- R purrr keep_at 根据元素的名称/位置保留/丢弃元素
- R purrr keep 根据元素的值保留/丢弃元素
- R purrr transpose 转置列表。
- R purrr flatten 将列表的列表展平为简单的向量
注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Safely get or set an element deep within a nested data structure。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。