使用 map 在 R 中创建串联列表项的对象

Using map to create an object of concatenated list items in R

我使用 Iris 数据集创建了一个虚拟函数,因此(希望)它是可重现的。

我有一个函数 returns 一个结果列表,然后我用这个函数 运行 几个术语,并将它们连接成一个列表。我想尝试用地图来做这件事,但我没有取得太大的成功。

这个函数基本上returns一个列表:

my_func <- function(spec) {
    specl <- grep(spec, iris$Species)

    full <- c()
    for (s in specl) {
        nam <- iris$Species[s]
        leng <- iris$Sepal.Length[s]
        lenglist <- list(leng) %>%
            setNames(str_c("val: ", nam, s))
        full <- c(full, lenglist)
    }
    return(full)
}

my_result <- c(
    my_func("setosa"),
    my_func("virginica")
)

head(my_result, 2)
$`val: setosa1`
[1] 5.1

$`val: setosa2`
[1] 4.9


length(my_result)
[1] 100

我想使用 purrr:::map 来制作这个结果对象。我试过这个:

terms <- c("setosa", "virginica")
my_result_with_map <- terms %>%
    map(~my_func(.x)) 

但结果是将每个术语列为单独的列表项:

> head(my_result_with_map)
[[1]]
[[1]]$`val: setosa1`
[1] 5.1
  
[[1]]$`val: setosa2`
[1] 4.9
  
[[1]]$`val: setosa3`
[1] 4.7

...

length(my_result_with_map)
[1] 2

是否可以使用地图重新创建原始 my_result 对象?

map returns a list 而在第一种情况下,我们使用 c 连接输出。 invokec 或使用 flatten

my_result_with_map <- terms %>%
    map(~my_func(.x))  %>%
    flatten

-输出

> head(my_result_with_map, 2)
$`val: setosa1`
[1] 5.1

$`val: setosa2`
[1] 4.9