我正在查看以下示例map()
来自“R 数据科学”。
一个例子是:
library(dplyr)
library(purrr)
df <- tibble(
a = rnorm(10),
b = rnorm(10),
c = rnorm(10),
d = rnorm(10)
)
df
#> # A tibble: 10 x 4
#> a b c d
#> <dbl> <dbl> <dbl> <dbl>
#> 1 -0.570 1.48 2.37 1.60
#> 2 0.122 2.08 0.222 0.0338
#> 3 -0.890 0.429 -1.75 -1.48
#> 4 0.334 0.854 0.849 -0.525
#> 5 1.22 -0.378 -1.00 -0.147
#> 6 -1.04 -0.427 -1.18 0.907
#> 7 -0.392 0.102 0.0951 0.842
#> 8 0.893 0.932 0.620 -0.911
#> 9 1.00 0.616 -0.937 -0.0286
#> 10 0.190 1.12 -1.02 1.45
在下面的map_dbl()中,我不需要在函数前添加波浪号map_dbl(~ mean)
我不必把.
df %>% map_dbl(mean)
#> a b c d
#> 0.08714704 0.68069227 -0.17382734 0.17470388
然而,在下面的示例中,我必须将~
在 .f 之前,我还必须指定data = .
models <- mtcars %>%
split(.$cyl) %>%
map(~ lm(mpg ~ wt, data = .))
models
我尝试阅读以前的答案,例如purrr::map 中第一个波形符的含义是什么,但我仍然不确定何时需要使用波形符和.
也许最简单的方法是我总是包含这两件事,即使它们并不是绝对必要的?
您的问题的快速答案是,调用地图时无需使用波浪号表示法。调用地图的方法有多种,波浪号符号就是其中之一。您已经描述了当函数仅接受/需要一个参数时调用 map 的最简单方法。
df %>% map_dbl(mean)
然而,当函数变得更加复杂时,基本上有两种方法可以使用波形符号或普通的匿名函数来调用它们。
# normal anonymous function
models <- mtcars %>%
split(.$cyl) %>%
map(function(x) lm(mpg ~ wt, data = x))
# anonymous mapper function (~)
models <- mtcars %>%
split(.$cyl) %>%
map(~ lm(mpg ~ wt, data = .))
波形符号基本上是将公式转换为函数,这在大多数情况下更易于阅读。每个选项都可以变成一个命名函数,其工作原理如下。理想情况下,命名函数将底层函数的复杂性降低到一个参数(应该循环的参数),在这种情况下,可以像映射中的所有简单函数一样调用该函数,而无需进一步的参数/符号。
# normal named function notation
lm_mpg_wt <- function(x) {
lm(mpg ~ wt, data = x)
}
models <- mtcars %>%
split(.$cyl) %>%
map(lm_mpg_wt)
# named mapper function
mapper_lm_mpg_wt <- as_mapper(~ lm(mpg ~ wt, data = .))
models <- mtcars %>%
split(.$cyl) %>%
map(mapper_lm_mpg_wt)
基本上这些都是你的选择。您应该选择最简单且最适合您的问题的方法。如果您再次需要的话,命名函数是最好的。许多人认为映射器函数更容易阅读,但归根结底,这是个人喜好的选择。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)