出力としてリストを提供するRのpurrrパッケージのマップ関数を使用しています。次に、出力を入力に基づく名前付きリストにしたいと思います。以下に例を示します。
input <- c("a", "b", "c")
output <- purrr::map(input, function(x) {paste0("test-", x)})
これから私はリストの要素にアクセスしたいと思います:
output$a
または
output$b
list
という名前を付けるだけです
names(output) <- input
名前に基づいて要素を抽出します
output$a
#[1] "test-a"
tidyverse
を使用してこれを行う必要がある場合
library(tidyverse)
output <- map(input, ~paste0('test-', .)) %>%
setNames(input)
承認された解決策は機能しますが、%>%
でパイピングを使用すると、エラーが発生してフローが中断される可能性がある繰り返し引数(input
)の影響を受けます。
別の解決策は、%>%
演算子のもう少し強力な方法を使用することです。
1:5 %>% { set_names(map(., ~ .x + 3), .) } %>% print # ... or something else
これはパイプからの議論を引き受けますが、まだいくつかの美しさに欠けています。別の方法として、次のような小さなヘルパーメソッドを使用できます。
map_named = function(x, ...) map(x, ...) %>% set_names(x)
1:5 %>% map_named(~ .x + 1)
これはすでにより美しくエレガントに見えます。そして、私が好む解決策でしょう。
最後に、引数が文字または整数ベクトルの場合にpurrr::map
を上書きして、そのような場合に名前付きリストを生成することもできます。
map = function(x, ...){
if (is.integer(x) | is.character(x)) {
purrr::map(x, ...) %>% set_names(x)
}else {
purrr::map(x, ...)
}
}
1 : 5 %>% map(~ .x + 1)
ただし、最適なソリューションは、purrr
がそのままの動作を実装する場合です。