←
PDF 353 / 520 Base R
→
English · PDF 353
Original PDF page 353
中文 · PDF 353

models <- mtcars %>% split(.$cyl) %>% map(function(df) lm(mpg ~ wt, data = df))

在 R 中创建匿名函数的语法相当冗长,因此 purrr 提供了一个便捷的简写方式——单侧公式:

models <- mtcars %>% split(.$cyl) %>% map(~lm(mpg ~ wt, data = .))

这里我使用 . 作为代词:它指代当前的列表元素(就像 for 循环中的 i 指代当前索引一样)。

当你查看多个模型时,可能想提取像 R 2 这样的汇总统计量。为此,我们需要先运行 sum mary(),然后提取名为 r.squared 的组件。我们可以使用匿名函数的简写来做到这一点:

models %>% map(summary) %>% map_dbl(~.$r.squared) #> 4 6 8 #> 0.509 0.465 0.423

但提取命名组件是一种常见操作,因此 purrr 提供了一个更简短的简写方式:你可以使用字符串。

models %>% map(summary) %>% map_dbl("r.squared") #> 4 6 8 #> 0.509 0.465 0.423

你也可以使用整数按位置选择元素:

x <- list(list(1, 2, 3), list(4, 5, 6), list(7, 8, 9)) x %>% map_dbl(2) #> [1] 2 5 8

Base R

如果你熟悉 base R 中的 apply 系列函数,可能已经注意到它们与 purrr 函数有一些相似之处:

  • lapply() 基本上与 map() 相同,区别在于 map() 与 purrr 中的所有其他函数保持一致,而且你可以对 .f 使用各种简写方式。