←
PDF 350 / 520 Exercises
→
English · PDF 350
Original PDF page 350
中文 · PDF 350

out[i] <- fun(df[[i]]) } out } col_summary(df, median) #> [1] 0.237 -0.218 0.254 -0.133 col_summary(df, mean) #> [1] 0.2026 -0.2068 0.1275 -0.0917

将一个函数传递给另一个函数是一个非常强大的思想,也是使 R 成为函数式编程语言的行为之一。理解这个思想可能需要你花一些时间,但这份投入是值得的。在本章的剩余部分,你将学习并使用 purrr 包,它提供的函数可以消除许多常见 for 循环的需要。R 基础包中的 apply 函数族(apply()、lapply()、tapply() 等)解决类似的问题,但 purrr 更加一致,因此更容易学习。

使用 purrr 函数代替 for 循环的目标是让你能够将常见的列表操作难题分解为独立的片段:

  • 你如何针对列表中的单个元素解决这个问题?一旦你解决了这个问题,purrr 会负责将你的解决方案泛化到列表中的每个元素。
  • 如果你正在解决一个复杂的问题,你如何将它分解成易于处理的小块,从而让你朝着解决方案前进一小步?使用 purrr,你会得到许多小块,可以用管道将它们组合起来。

这种结构使解决新问题变得更容易。当你重读旧代码时,它也让你更容易理解自己对旧问题的解决方案。

练习

    1. 阅读 apply() 的文档。在第二种情况下,它泛化了哪两个 for 循环?
    1. 修改 col_summary(),使其仅应用于数值列。你可能想从一个 is_numeric() 函数开始,该函数返回一个逻辑向量,其中每个数值列对应一个 TRUE。