【发布时间】:2017-12-19 10:35:37
【问题描述】:
我有什么理由应该使用
map(<list-like-object>, function(x) <do stuff>)
而不是
lapply(<list-like-object>, function(x) <do stuff>)
输出应该是相同的,我所做的基准测试似乎表明lapply 稍微快一些(应该是map 需要评估所有非标准评估输入)。
那么对于这种简单的情况,我是否应该考虑切换到purrr::map?我不是在这里询问一个人对语法的好恶,purrr 提供的其他功能等,而是严格地比较purrr::map 与lapply 假设使用标准评估,即map(<list-like-object>, function(x) <do stuff>)。 purrr::map 在性能、异常处理等方面有什么优势吗?下面的 cmets 表明它没有,但也许有人可以详细说明一下?
【问题讨论】:
-
对于简单的用例,最好坚持使用基础 R 并避免依赖。如果您已经加载了
tidyverse,您可能会受益于管道%>%和匿名函数~ .x + 1语法 -
这几乎是一个风格问题。你应该知道基本的 R 函数是做什么的,因为所有这些 tidyverse 的东西只是它上面的一个外壳。在某些时候,那个外壳会破裂。
-
~{}快捷方式 lambda(有或没有{}对我来说是简单的purrr::map()的交易。purrr::map_…()的类型强制比vapply()更方便且不那么迟钝.purrr::map_df()是一个超级昂贵的函数,但它也简化了代码。不过,坚持使用 base R[lsv]apply()绝对没有错。 -
谢谢你的问题——我也看过一些东西。我使用 R 已有 10 多年了,绝对不会也不会使用
purrr的东西。我的观点如下:tidyverse非常适合分析/交互/报告的东西,而不是编程。如果您不得不使用lapply或map,那么您正在编程并且可能有一天会创建一个包。那么依赖越少越好。另外:我有时会看到人们使用map之后的语法非常晦涩。现在我看到了性能测试:如果你习惯了applyfamily:坚持下去。 -
Tim 你写道:“我不是在问一个人对语法的好恶,purrr 提供的其他功能等,而是严格地比较 purrr::map 与 lapply 假设使用标准评估”,而您接受的答案正是您所说的不希望人们过去的答案。