web-dev-qa-db-ja.com

purrrのマップ関数の入力を使用して、Rの出力として名前付きリストを作成します

出力としてリストを提供するRのpurrrパッケージのマップ関数を使用しています。次に、出力を入力に基づく名前付きリストにしたいと思います。以下に例を示します。

input <- c("a", "b", "c")
output <- purrr::map(input, function(x) {paste0("test-", x)})

これから私はリストの要素にアクセスしたいと思います:

output$a

または

output$b
19
Michael

listという名前を付けるだけです

names(output) <- input

名前に基づいて要素を抽出します

output$a
#[1] "test-a"

tidyverseを使用してこれを行う必要がある場合

library(tidyverse)
output <- map(input, ~paste0('test-', .)) %>% 
                                setNames(input)
22
akrun

承認された解決策は機能しますが、%>%でパイピングを使用すると、エラーが発生してフローが中断される可能性がある繰り返し引数(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がそのままの動作を実装する場合です。

5
Holger Brandl