原帖已经跑偏所以另开一贴 https://d.cosx.org/d/420961-r-bookdown/24

地址是
https://github.com/tcgriffith/pinyin

花了两个小时大刀阔斧改了一番,砍到只剩一个函数,我觉得很满意了,效果:

remotes::install_github("tcgriffith/pinyin")
#> Skipping install of 'pinyin' from a github remote, the SHA1 (1449a0a3) has not changed since last install.
#>   Use `force = TRUE` to force installation

pinyin::py("我喜欢旅游 abcasdfasdfa")
#>           我喜欢旅游 abcasdfasdfa 
#> "_wo_xi_huan_lv_you abcasdfasdfa"

@dapengde 的版本

> pinyin::py("我喜欢旅游 abcasdfasdfa")
                       我喜欢旅游 abcasdfasdfa 
"wǒ_chì_huān_lǚ_liú_ _a_b_c_a_s_d_f_a_s_d_f_a" 

<sup>Created on 2019-10-19 by the reprex package (v0.3.0)</sup>

benchmark一下

# install.packages("pinyin")
microbenchmark::microbenchmark(pinyin::py("我喜欢旅游 abcasdfasdfa"), unit="ms", times = 10)
#> Unit: milliseconds
#>                                   expr      min      lq     mean   median
#>  pinyin::py("我喜欢旅游 abcasdfasdfa") 587.0348 606.886 622.6891 616.3186
#>        uq      max neval
#>  646.1422 664.5387    10

# remotes::install_github("tcgriffith/pinyin")
# session-restart

microbenchmark::microbenchmark(pinyin::py("我喜欢旅游 abcasdfasdfa"), unit="ms", times = 10)
#> Unit: milliseconds
#>                                   expr      min       lq     mean   median
#>  pinyin::py("我喜欢旅游 abcasdfasdfa") 5.003324 5.423483 7.204472 5.953467
#>        uq     max neval
#>  6.265239 13.6036    10

快了百倍

说一下我觉得大鹏写的很奇怪的地方还有我改的地方…

  • map数据用list2env转成了environment,第一次见啊!于是我改成了KEY-VALUE的dataframe
  • data存为txt,默认运行一次函数py就读一次那个txt,太不环保了,我转成了rdata存进data里,这样加载包的时候数据直接可用。
  • 核心其实就是把字符串分成单字,然后遍历所有单字,按照对应的汉字->拼音进行替换,不过循环里嵌套了两个if判断感觉有点多余,于是改用了match()。

快推 PR 给大鹏来次更新,我都迫不及待想安装了,然后用到 blogdown 里,简直完美

    Cloud2016
    你可以用remotes::install_github("tcgriffith/pinyin")先试用起来

    不过砍成现在这样我估计大鹏意见会很大哈哈哈哈

    @tctcab 不仅没意见,简直是热烈欢迎啊!只是我没时间去比较和合并。要不这样,你把你这个唯一的函数改个名字,例如叫 pinyin,并且在包的 DESCRIPTION 的作者字段加上你的名字,我提交到 CRAN 先。

    解释一下你说的奇怪的地方:

    • map数据用list2env转成了environment。

    前面我说过了,这个是用户提的两个提速方案的第一个。我也是第一次用。

    • data存为txt,默认运行一次函数py就读一次那个txt,太不环保了,我转成了rdata存进data里,这样加载包的时候数据直接可用。

    这是误解。前面我说了,只要先运行一次 pydic() 函数,就一劳永逸,不必每运行一次就读一次。

    原始字典文件以 txt 保存的目的之一是让普通用户只需用文本编辑器就能轻松修改字典。

    • 循环里嵌套了两个if判断感觉有点多余,于是改用了match()。

    这个我没注意,可能当时就是这个码字水平吧……

      dapengde
      那我整理一下文档就pr了。还有几个问题,m

      • pinyin2的来源?

      • 那个批量改文件名的功能还有bookdown我觉得只是很特别的使用案例,从功能分析不应该由pinyin包来做,去掉比较好,没问题吧。

      • 普通用户并没有修改字典的需求,我倾向于使用字典的数据与上游来源保持一致。这算是个虚构的需求,代价是比我的代码慢了一百倍

        已PR,改动挺大,删掉了所有我认为没用的东西。

        跟tmcn比了一下,效率跟效果都差不多,那只能说明dapeng最开始写的包真不咋滴

        library(tmcn)
        #> # tmcn Version: 0.2-13
        library(pinyin)
        
         pinyin::py("我喜欢旅游 abcasdfasdfa")
        #>           我喜欢旅游 abcasdfasdfa 
        #> "_wo_xi_huan_lv_you abcasdfasdfa"
        
        tmcn::toPinyin("我喜欢旅游 abcasdfasdfa")
        #> [1] "woxihuanlvyou abcasdfasdfa"
        
        microbenchmark::microbenchmark(list = list(
            pinyin = pinyin::py("我喜欢旅游 abcasdfasdfa"),
          tmcn = tmcn::toPinyin("我喜欢旅游 abcasdfasdfa")
        ), unit="ns", times = 100)
        #> Unit: nanoseconds
        #>    expr min lq  mean median uq max neval cld
        #>  pinyin  10 14 17.31     15 16 162   100   a
        #>    tmcn  11 13 18.97     14 15 470   100   a

        <sup>Created on 2019-10-21 by the reprex package (v0.3.0)</sup>

        tctcab 谢谢你的 PR!然而你删得太狠了。我不是说了嘛,只要把新写的函数改个名字,添加到包里就行了(如果跟原有函数不冲突的话),啥都不耽误。你得考虑现有用户的习惯和前后版本的连续性啊!就算有一万个理由删除,在删除之前也得有个 to be decrepated 的过渡说明啊!

        tmcn 包我在 pinyin 包开发手记里说过了:<https://openr.pzhao.org/zh/blog/pinyin-v.1.1.5/> 。当时没有发现 tmcn 的这个功能,于是就写了 pinyin 包,功能上强大一些。

        剩下的几个问题:

        • pinyin2 的来源是我前面提到的那位提速用户提供的。没有更进一步的来源信息了,就当是他自定义的吧。
        • 另外的几个函数,确实属于特别的使用案例。至于放在包里有没有用,见仁见智吧。很多包都在主函数外附加一些封装的函数作为使用案例。考虑到版本的连续性,我希望留着。万一真有人正在用呢。
        • “普通用户并没有修改字典的需求”,对这个我持保留意见。只要用户能轻松修改字典(代价仅仅是个 txt 文件而已),就可以费很小的精力完成更灵活的任务。
          tctcab 更改标题为「R 包 pinyin2