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