lmap()
、 lmap_at()
和 lmap_if()
與 map()
、 map_at()
和 map_if()
類似,隻不過它們不是映射到 .x[[i]]
,而是映射到 .x[i]
。
這有幾個優點:
-
它使得使用專門使用列表的函數成為可能。
-
它允許
.f
訪問封裝列表的屬性,如names()
。 -
它允許
.f
返回比它接收到的更大或更小的列表,從而更改輸出的大小。
參數
- .x
-
列表或 DataFrame 。
- .f
-
一個函數,它接受一個長度為 1 的列表並返回一個列表(任意長度)。
- ...
-
傳遞給映射函數的附加參數。
我們現在通常建議不要使用
...
將附加(常量)參數傳遞給.f
。相反,使用簡寫匿名函數:# Instead of x |> map(f, 1, 2, collapse = ",") # do: x |> map(\(x) f(x, 1, 2, collapse = ","))
這使得更容易理解哪些參數屬於哪個函數,並且往往會產生更好的錯誤消息。
- .p
-
單個謂詞函數、說明此類謂詞函數的公式或與
.x
長度相同的邏輯向量。或者,如果.x
的元素本身是對象列表,則為指示內部列表中邏輯元素名稱的字符串。隻有.p
計算結果為TRUE
的元素才會被修改。 - .else
-
應用於
.x
元素的函數,其中.p
返回FALSE
。 - .at
-
給出要選擇的元素的邏輯向量、整數向量或字符向量。或者,函數接受名稱向量,並返回要選擇的元素的邏輯向量、整數向量或字符向量。
:如果安裝了 tidyselect 軟件包,則可以使用
vars()
和 tidyselect 幫助器來選擇元素。
例子
set.seed(1014)
# Let's write a function that returns a larger list or an empty list
# depending on some condition. It also uses the input name to name the
# output
maybe_rep <- function(x) {
n <- rpois(1, 2)
set_names(rep_len(x, n), paste0(names(x), seq_len(n)))
}
# The output size varies each time we map f()
x <- list(a = 1:4, b = letters[5:7], c = 8:9, d = letters[10])
x |> lmap(maybe_rep) |> str()
#> List of 6
#> $ b1: chr [1:3] "e" "f" "g"
#> $ b2: chr [1:3] "e" "f" "g"
#> $ b3: chr [1:3] "e" "f" "g"
#> $ c1: int [1:2] 8 9
#> $ c2: int [1:2] 8 9
#> $ d1: chr "j"
# We can apply f() on a selected subset of x
x |> lmap_at(c("a", "d"), maybe_rep) |> str()
#> List of 4
#> $ b : chr [1:3] "e" "f" "g"
#> $ c : int [1:2] 8 9
#> $ d1: chr "j"
#> $ d2: chr "j"
# Or only where a condition is satisfied
x |> lmap_if(is.character, maybe_rep) |> str()
#> List of 5
#> $ a : int [1:4] 1 2 3 4
#> $ b1: chr [1:3] "e" "f" "g"
#> $ b2: chr [1:3] "e" "f" "g"
#> $ c : int [1:2] 8 9
#> $ d1: chr "j"
相關用法
- R purrr list_transpose 轉置列表
- R purrr list_simplify 將列表簡化為原子或 S3 向量
- R purrr list_flatten 壓平列表
- R purrr list_c 將列表元素組合成單個數據結構
- R purrr list_assign 修改列表
- R purrr accumulate 累積向量縮減的中間結果
- R purrr imap 將函數應用於向量的每個元素及其索引
- R purrr as_vector 將列表強製轉換為向量
- R purrr map_if 有條件地將函數應用於向量的每個元素
- R purrr map2 映射兩個輸入
- R purrr array-coercion 強製數組列出
- R purrr auto_browse 包裝一個函數,以便在出錯時自動 browser()
- R purrr pluck 安全地獲取或設置嵌套數據結構深處的元素
- R purrr insistently 將函數轉換為等待,然後在錯誤後重試
- R purrr map_depth 在給定深度映射/修改元素
- R purrr rerun 多次重新運行表達式
- R purrr quietly 包裝一個函數來捕獲副作用
- R purrr pmap 同時映射多個輸入(“並行”)
- R purrr possibly 包裝函數以返回值而不是錯誤
- R purrr head_while 查找全部滿足謂詞的頭/尾。
- R purrr rbernoulli 從伯努利分布生成隨機樣本
- R purrr rate-helpers 創建延遲率設置
- R purrr keep_at 根據元素的名稱/位置保留/丟棄元素
- R purrr keep 根據元素的值保留/丟棄元素
- R purrr transpose 轉置列表。
注:本文由純淨天空篩選整理自Hadley Wickham等大神的英文原創作品 Apply a function to list-elements of a list。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。