当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R purrr pluck 安全地获取或设置嵌套数据结构深处的元素


pluck() 实现了 [[ 的通用形式,允许您深入、灵活地索引数据结构。它总是成功,如果您尝试访问的索引不存在或者是 NULL ,则返回 .default

pluck<-() 是等效的赋值,允许您修改嵌套数据结构深处的对象。

pluck_exists() 使用与 pluck 相同的规则告诉您对象是否存在(即 NULL 元素相当于不存在的元素)。

用法

pluck(.x, ..., .default = NULL)

pluck(.x, ...) <- value

pluck_exists(.x, ...)

参数

.x, x

向量或环境

...

用于索引对象的访问器列表。可以是正整数、负整数(从右侧索引)、字符串(从名称中索引)或访问器函数(仅支持名称和位置的赋值变体除外)。如果正在索引的对象是 S4 对象,则按名称访问它将返回相应的槽。

支持Dynamic dots。特别是,如果您的访问器存储在列表中,您可以将其与 !!! 拼接。

.default

如果目标是 NULL 或不存在,则使用的值。

value

要在 .x 中的拔取位置替换的值。使用 zap() 来删除该元素。

细节

  • 您可以使用标准访问器(例如整数位置和字符串名称)进行拔取或卡盘,并且还接受任意访问器函数,即获取对象并返回某些内部片段的函数。

    这通常比运算符和访问器的组合更具可读性,因为它线性读取并且没有语法缺陷。比较: accessor(x[[1]])$foopluck(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/pluck.R

相关用法


注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Safely get or set an element deep within a nested data structure。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。