使用 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
连接输出。 invoke
与 c
或使用 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
我使用 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
连接输出。 invoke
与 c
或使用 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