Hoas 加载 tidyverse 这个包会加载一大堆(这里的量词我很想用“坨”)跟这里的任务毫无关系的包,而且这个加载是 attach() 式的而不是 loadNamespace() 式的(即:暴露包内所有导出的对象),所以会严重污染用户的工作空间。只是为了一个管道操作符的话,加载 magrittr 就可以了。其实我是非常希望 magrittr 整个包只有 %>% 这么一个导出对象,因为这个对象被使用的频率应该远超过这个包里其它对象,用户加载起来不用加载进一堆用不着的对象。

在我看来,tidyverse 这个 R 包只该有一个用途,就是 install.packages('tidyverse') 时自动把极乐净土的众神都请下来。在这之后,该求哪个神仙就 library() 哪个,而不要每次都把玉皇大帝、二郎神、西天如来、东海龙王、牛魔王、阎王爷、灶王爷、黑白无常、蜘蛛精、九尾妖狐等一堆神仙鬼怪摆上香案。

嗯,我洁癖:若无必要,勿扰工作空间。

    yihui 哈哈,其实我也有点洁癖,这样用的原因之一是自己对工作空间的了解没有那么深,现在看来我洁癖的空间又扩充了……

      yihui Hoas Jiena tctcab

      最近我向人推荐使用 Base R 去做数据操作,Base R 总共就那么 10 来个函数做这个事,干嘛要把这个数据操作的问题扩充到 10 来个不是自己维护的 R 包,里面的魔法太多了,根本记不住,出错了也难以兜住,而且作者也在不断的更新里面的函数,甚至重新设计。

      1. Base R 内10来个函数指的是:

        1. reshape 将长的数据框变形为宽的数据框
        2. transform 可以在原来的数据框上添加新的一列,这个新的列通常是根据已有的列加减乘除等计算而来
        3. subset 提取数据框中的某些列和行,也可以用 $[ 实现
        4. order 按照数据框的某(些)列排序,如先按照第一列从小到大排序,再按照第二列从小到大排序
        5. split 将数据框按照某个分类变量拆分为列表,后续常常可以接 lapply 实现分组计算
        6. merge 合并两个数据框 inner outer left 和 right 四种合并方式,和 SQL 中的 left_join 等操作如出一辙
        7. duplicated 查出是否有重复的记录,后续可以决定是否去掉
        8. complete.cases 查出是否有不完整的记录,后续考虑是否要去掉
        9. aggregate 聚合,这个就不解释了,大家都懂
        10. 最后再加上 Reducedo.callapply 真的够了,应付 90% 的数据操作应该没问题
      2. 作者最初造了 reshape 包(退休了),接着是 reshape2 (也退休了)然后是 plyr (还是退休了)现在是 purrr 大家猜猜下一个会是谁?

      3. 作者也比较 High 造 tidyr 包新搞了 gatherspread 猜猜这两个函数在干嘛? reshape ! 命名不直观大家都记不住,结果只好请大家来决定叫个啥名好 ,因为又有超级豪华版的 pivot table 等待大家 <https://t.co/cJ0GM1VZ1H>

      4. 我发现老有人用 by 函数来试图证明 Base R 的糟糕,因为它严重打破一致性,有那么多其它可用来操作的函数,我就想问他为啥要用这个?

      最近怼力有点足,大家见谅!

        Cloud2016 怼得爽,我喜欢。

        • str_length? nchar.
        • str_c? paste.
        • str_sub? substr.
        • str_to_lower? tolower.
        • str_split? strsplit.
        • str_detect? grep.
        • ...

        可以列很长。横跨好几个包。

        单从命名看,base R 确实一致性比较差。就说上面这几个,tidyverse 只需记一下 str_,然后用编辑器的自动补全功能就行了。如果先接触tidyverse,后接触 base R,那可能会觉得后者难记。有先入为主的因素吧。

        除了功能和结构外,作者可能很大程度上是对 base R 的函数名不满,然而又改不了,所以干脆重来一遍。透过奇怪的函数名,隐隐感觉到某种情绪,恨不得砸烂一个旧世界,重建一个新世界。就跟罗振宇发明了很多新名词一样,其实是老内容。

        tidyverse 最诱人的地方,还是哥哥画呃。

          Cloud2016
          极乐净土势力的好处是管道和参数一致性。能干的事情baseR也能干这也不假,同样的数据清理搞了很多新包我也觉得好麻烦啊。

          还有ggplot2,这个名字里的2就很让人费解

            tctcab Hadley 大人创意太多,而且每个创意都一不小心就太流行了,然后想来个大改动却发现已经刹不住车,只好另起炉灶。其实几年前险些就诞生了 ggplot3……又是一段 CRAN 黑历史斗争,不说了。

            一致性确实是非常重要,但一致性的副作用是宗教倾向。领略到了一致性的美好,就会过度敌视不一致性,以为只有一致性才属于文明社会、才是文明人应该遵守的法则。我今年初的报告中借弗洛伊德的《文明及其缺憾》表达了我对期刊排版一致性的强烈不满:https://bit.ly/pagedown#39 文明的特征之一就是秩序(服从),但它会压制个性。

            再次澄清一点:我支持极乐净土,我认为它的积极作用远大于毒副作用,我只是说没必要三句话不离管道,仿佛不管道、不成活一样。任何忍术都有其缺陷。

              yihui

              hadley大人很厉害,不过我也同意你的说法:将他偶像化并不好。

              我现在算是极乐净土和基础R的混打选手, 极乐净土的包或者理念其实好多都还没深入用过,比如我毫不羞耻地承认至今没搞懂non-standard evaluation…

                yihui 想起了上世纪初的文言和白话之争。有些人主张一切尽用白话,反对一切有古文气息的写法。鲁迅也宣传白话,反对古文,不过他说,例如:“林冲笑道:原来,你认得。”这样的表达也不必非要写成“原来,你认得。”林冲笑着说。

                如何方便就如何处理,何必尾生抱柱,痛并难过着。有些东西跟瘟疫一样传播,比如 Base R 的一些缺点和极乐净土(与 pipe)的一些优点。人们往往没有思考就接受了,然后成为新的传播媒介。

                我常用极乐净土的工具,但是看到 data %>% head() 这样的写法就仿佛看到了“林冲笑着说”。

                  Base R 的操作函数

                  • stats 包: reshape aggregate complete.cases
                  • base 包: transform subset order split merge duplicated Reduce do.call apply lapply

                  Base R 的函数非常简洁明了,上面提及的数据操作函数都在 stats 和 base 两个包里,再比如文件操作的系列函数 file.* dir.* sys.* 和字符串操作的系列函数 ?regex 也都在一两个 Base R 包里。它太丰富了,功能太全面了,可见 Base 是就其在 R 包的地位而言,这样做对初学者太不友好,查看一下 ls("package:base") 就会发现 1232 个涉及诸多方面的函数,极有可能当初设计的时候功能拆分没有到位,这些 Base R 的数据操作函数功能很强,文档看起来很枯燥,导致 tidyverse 有机可乘,将 reshape 函数拆成一个包,aggregate 函数在 dplyr 里拆成一段一段的,诸如此类。Python 不这么干,分成一系列子模块,功能分类做的比较好!这两种方式代表了不同的思维模式,萝卜白菜各有所爱。

                  至于说宗教信仰,可能信奉 Base R 的真有,官方主页和文档万年不变,开发一直在 SVN 上,可能就那么二三十号人维护源码,开源但没有充分利用开源的力量(这个要分析源码提交记录,看是不是几十年来主力一直没变,我记得在某个大佬的 slide 上分析过,但是我记不得了在哪了,哪位大侠有空帮忙找下,我看过之后一直搜不出来,slide 里面有图,配色方案是 hcl 分析提交记录使用了 XML 包和不少正则,分析的源代码在 Github 上开放的)

                  PS

                  刚才脑子一下子清澈了,马上搜出来了,是大佬 Roger Bivand , Slide 及其源码在 https://github.com/rsbivand/eRum18

                  • Hoas 回复了此帖

                    Liechi 你跟我想到一块去了(文言与白话),只不过我没说出来而已;可能是最近你提鲁迅比较多,而碰巧我这几个月也正好一直在看鲁迅的文集。

                    Liechi tctcab 我也是混打选手,但倾向于 Base R ,之前有 ggplot 但是庆幸我没赶上

                    dapengde 命名一致性是个问题,输入是一个数据框,输出是一个非数据框,这种不一致性更加糟糕,这也是 tidyverse 造 tibble 打通数据分析流的优势,也成就了大量的 broom broom.mixed broomExtra tidymodel 模型输出一致性的清理包。另外关于 Base R 和 stringr 的正则、字符串操作函数对比,这有份完整的,不必自己整理了 https://stringr.tidyverse.org/articles/from-base.html

                      Cloud2016 开源但没有充分利用开源的力量

                      这句话说得好,有些时候我也很纳闷为什么会有这么多功能重复的函数,为什么非要在 base 已有的基础上开发新的以及,为什么 R Core Team 不作适当的整合,像 tidyverse 一样分好类。可能这里存在着一些看不见摸不着的博弈吧……

                      我纳闷但是我不纠结,因为自己能用就行了,不需要多管哪个是哪个。

                        Hoas 既然已经知道 R Core Team 这么做,今后也不太可能做功能拆分和整合。所以 Base R 就是代指那些 R 包合集,相当于 tidyverse

                        Pkgs <- sapply(list.files(R.home("library")), function(x)
                          packageDescription(pkg = x, fields = "Priority"))
                        names(Pkgs[Pkgs == "base" & !is.na(Pkgs)])
                         [1] "base"      "compiler"  "datasets"  "graphics"  "grDevices" "grid"     
                         [7] "methods"   "parallel"  "splines"   "stats"     "stats4"    "tcltk"    
                        [13] "tools"     "utils"    

                        Liechi yihui 对圆环套圆环那种多层套娃来说,管道确实方便阅读,层数越多越有利。然而据我观察,用户养成习惯之后,即便是两三层,管道顺手就来了,挡不住。这个小东西表面似乎是技术层面的改动,然而底层碰的是哲学层面,或者说是思维方式。俗称洗脑。

                        Cloud2016 tctcab 像 ggplot2 这样的包名还算是好的,dplyr 已经到我记忆的极限了,“噗啊啊啊”包完全靠拼音才记得住,而专管管道那个包的名称……我放弃治疗了。@yihui 不要嫌弃,如果换我,我也加载 'tidyverse',而不是 'mag...'——臣妾实在记不住啊!

                        包名和函数名是我转用 tidyverse 的最大障碍,纯属人为制造,完全没必要。str_c()如果叫str_paste()select() 如果叫 df_subset(),那么对 base R用户就会友好很多。而像summarise(),猛一看还以为是 summary(),其实它是tapply(),这就让人很割裂,似乎跟 base R 有不共戴天之仇,拼命任性地划清界限,而不计对 base R 用户习惯的忽视。换位思考一下,如果 R 初学者先接触了 tidyverse,那么让他从 summarise()tapply() 过渡肯定也是内心一百个不情愿。正如我在前两天的吐槽帖 里所说:

                        生活在秦国的人,不需要知道周天子。

                        至于 tidyverse 函数输入和输出的一致性,它确实是一个卖点,然而我觉得并不是很大的痛点,有人为炒作的水分。“输入数据框,输出也必须是数据框”,这个前提是 tidyverse 很多函数存在的合理性之一,然而推敲一下,这个前提的基础并不那么坚实——它把“一致性”偷偷限定在了“数据框”层面。这样,管道出口入口处倒是一致了,可是得先把数据转成 tidyverse 接受的形式才能进管道,而管道里出来的不一定是你要的最后结果,还得进一步转换。可是别忘了,base R 的一致性也很好啊,只不过是体现在维度更低、结构更简单的“向量”层面。如果说 tidyverse 是对数据进行分子层面的改造,那么 base R 就是进行原子层面的改造。

                        作为一个普通用户,我上述看法可能都是片面甚至是错误的。不过,就像秦灭周一样, tidyverse 的野心若隐若现。未来,tidyverse 会不会跟 base R 分道扬镳,就像 openoffice 和 libreoffice 呢?

                        如果是这样,那就干脆把 base R 跟 tidyverse 当作两门不同的编程语言来学习和使用吧。

                          dapengde 专管管道那个包的名称……我放弃治疗了

                          我也是放弃治疗了,不知多少次我要先找 dplyr 然后找那个包,为啥不直接叫 pipe 我绝对 1 秒钟记住它

                          这些大神都有个习惯,取一个颇有深意的名字,在我看来最接近内容的是好名字

                          yihui

                          隔一年把某大包作者来出来炮击一次啊

                            dapengde summarisetapply 的一大不同是它们处理的数据形式不同,summarise 要求数据符合 tidy 风。我觉得 Hadley 提倡的 tidy data 是极乐净土的灵魂:不管是数据整理,还是哥哥作图,如果觉得操作不顺手了,往往是由于数据不够“整然”造成的。Tidy data 的要求使得极乐净土处理的数据基本单元是数据表,而 R base 处理的基本单元是向量,这导致了两者在数据分析过程中的一些逻辑差异。这差异当你用 summarise 处理 iris 数据时就能体会到。

                            我觉得极乐净土和 Base R 在具体操作的不同只是形而下的器的差异,但是对数据形式要求的不同则属于形而上的道的殊途了。进化领域有句话叫做:

                            Nothing in Biology Makes Sense Except in the Light of Evolution.

                            在极乐净土世界似乎也可以说:

                            Nothing in Tidyverse Makes Sense Except in the Form of Data that is Tidy.