當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。