第一个缺点:稳定性
一个缺点是tidyverse 函数的变化比base R 更快。因此,如果您想要长期稳定,我会选择base R。也就是说,tidyverse 开发人员对他们的开发持开放态度不同的方法。参见例如Welcome to the Tidyverse vignette:
[base R 和 tidyverse 之间] 的最大区别在于优先级:base R 高度关注稳定性,而 tidyverse 会在寻找更好的界面时做出重大改变。
...哈德利对Do you expect the tidyverse to be the part of core R packages some day?的回答
这是极不可能的,因为核心包非常保守,所以base R 代码是稳定的,并且向后兼容。我更喜欢采用更乌托邦式的方法,在尝试找出更好的 API 的同时,我可以非常积极地进行向后不兼容的更改。
第二个缺点:灵活性
整洁的数据概念很棒,但在转换后具有与以前相同的行号(参见mutate)并不总是可能的。参见示例
library(tidyverse)
data.frame(matrix(rnorm(1000), ncol= 10)) %>%
mutate_all(function(i) density(i)$x)
由于行号更改而导致错误。有时我会遇到mutate 抱怨行号不一样的情况。与summarise 类似,它期望每列只有一个长度,例如range 不是这种情况。当然,有一些解决方法,但我更喜欢这里的基本 R
apply(data.frame(matrix(rnorm(1000), ncol= 10)), 2, function(i) density(i)$x)
第三个缺点:复杂性
在某些情况下,tidyverse 可以工作,但要麻烦得多。前段时间问了一个question这个代码怎么做
df[df$age > 90, ] <- NA
... 在 tidyverse 和建议使用的两个答案中
df %>% select(x, y, age) %>% mutate_all(~replace(.x, age> 90, NA))
# or
df %>% mutate_all(function(i) replace(i, .$age> 90, NA))
这两个答案都有效,但显然不如使用基本 R 编码。
第四个缺点:局限性
如果你想定义你自己的函数,你可以做类似my_fun <- function(x) ... 的事情,其中function 本身是一个base R 函数,据我所知没有tidyverse 对应物。有很多例子,base R 函数没有 tidyverse 等价物,而且可能永远不会有,例如rnorm、eval、c 等等。事实上,这并不是tidyverse 的缺点,但它表明tidyverse 和base 对不同的事物都有好处,这就是为什么你应该同时学习两者。
为什么不应该结束这个问题
该问题已作为重复问题关闭,并链接到另一个关于 tidyverse 与 data.table 的问题。在我看来,如果有人询问 tidyverse(或任何其他包)的缺点,这并不意味着该人要求与 data.table 包进行比较。相反,通过将 tidyverse 与链接问题中 not 完成的 R base 进行比较,可以更明显地看出 tidyverse 的缺点,例如这个问题不是重复的。