了解Purr地图输出

时间:2018-10-16 10:24:43

标签: r purrr

将头缠绕在地图返回的内容上会遇到一些麻烦

map(1:3, print)
[1] 1
[1] 2
[1] 3
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

前三个输出很有意义,因为它们与手动输入

返回的内容匹配
print(1)
print(2)
print(3)

在此之后,这似乎是某种嵌套列表。有什么办法只能得到其中一个?

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:3)

因此,我认为正在发生的情况是map返回了一个列表,而print返回了控制台。因此,您看到的是printmap的返回。当您将其分配给变量时,这一点变得非常明显。

library(purrr)

#no assignment, both returns
map(1:3, ~print(.x))
#> [1] 1
#> [1] 2
#> [1] 3
#> [[1]]
#> [1] 1
#> 
#> [[2]]
#> [1] 2
#> 
#> [[3]]
#> [1] 3

x <- map(1:3, ~print(.x))
#> [1] 1
#> [1] 2
#> [1] 3


x
#> [[1]]
#> [1] 1
#> 
#> [[2]]
#> [1] 2
#> 
#> [[3]]
#> [1] 3

您可以在此处看到,即使您为变量分配了map(1:3, ~print(.x))print仍会向控制台返回1:3,并且变量x在列表中保留了1:3的值。 / p>

答案 1 :(得分:2)

使用purrr,您可以指定要获取的输出,如下所示:

map_int(1:3, print)

#[1] 1
#[1] 2
#[1] 3
#[1] 1 2 3

请参阅?map以获取所有可能的结果。当然,如果您想要的结果没有意义,例如map_lgl(1:3, print),它将引发错误。

当您在自定义函数中使用map时,这非常有用,因为您可以控制输出,并在出现问题时捕获错误。

当然,您可以单独使用map,但是像您的示例一样,最好使用更精确的内容({map_intmap_dfmap_char等)