首页 > 解决方案 > 使用 tidyverse 有什么缺点吗?

问题描述

对于任何与在 R 中处理数据相关的事情,我最近一直认为 tidyverse 几乎是必不可少的。这就提出了一个问题——如果这就是它所宣传的一切,有什么理由不使用它吗?例如,tidyverse 中的框架是否有任何值得一提的限制?

标签: rtidyverse

解决方案


第一个缺点:稳定性

一个缺点是tidyverse函数的变化比 R 更快base。因此,如果您想要长期稳定,我会选择基本 R。也就是说,tidyverse开发人员对他们的不同方法持开放态度。参见例如欢迎来到 Tidyverse 小插曲

[R 和 tidyverse 之间] 的最大区别在于base优先级:基础 R 高度关注稳定性,而 tidyverse 将在寻找更好的界面时做出重大改变。

...以及 Hadley 对您是否希望 tidyverse 有朝一日成为核心 R 软件包的一部分的回答?

这是极不可能的,因为核心包非常保守,因此baseR 代码是稳定的,并且向后兼容。我更喜欢采用更乌托邦式的方法,在尝试找出更好的 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 可以工作,但要麻烦得多。前段时间我问了一个问题如何做这个代码

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本身就是一个baseR 函数,据我所知没有tidyverse对应的函数。有很多例子表明baseR 函数没有等效的 tidyverse,而且可能永远不会有,例如rnormevalc等等。事实上,这并不是一个缺点,tidyverse但它表明了这一点,tidyverse并且base对不同的事物都有好处,这就是为什么你应该同时学习两者的原因。

为什么这个问题不应该被关闭

该问题已作为副本关闭,并链接到另一个关于 tidyverse 与 data.table 的问题。在我看来,如果有人询问 tidyverse(或任何其他包)的缺点,这并不意味着该人要求与 data.table 包进行比较。相反,通过将 tidyverse 与链接问题中未完成的R 基础进行比较来更明显地说明 tidyverse 的缺点,例如,此问题不是重复的。


推荐阅读