Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

把书里所有的作图代码全部写进包里 #35

Closed
pzhaonet opened this issue Jul 23, 2020 · 5 comments
Closed

把书里所有的作图代码全部写进包里 #35

pzhaonet opened this issue Jul 23, 2020 · 5 comments

Comments

@pzhaonet
Copy link
Contributor

把书里所有代码做出来的图的代码,加上详细注释,全部写进 MSG 包里,并且在书里相应的位置说明,例如在图的 Caption 里。

这样做的好处有三:

  1. 保持全书的一致性。目前有些地方是全代码,有些地方用 demo(),风格不统一。
  2. 方便读者重现图形。一句代码出图,从读者角度会很爽。也方便那些 R 初学者或者非 R 用户,说不定因为这个就爱上 R 了。
  3. 方便更新升级。万一将来因为各种变化导致书里的大段代码失效,至少读者可以运行 demo() 来画图和获取新代码。这样,书的生命力会更久。这个意思可以在前言里说明。

甚至可以在 demo 里写个 hello.R,作为开场白。当然也可以写进 vignette 里。

不过,我没有写 demo 的经验,不知道这样会不会在 CRAN 审查的时候出现一些麻烦。比如在包的函数里是不许有中文字符的,那么 demo 里呢?demo 里加载的包,是否需要在 DESCRIPTION 里声明?增加很多demo的话,会不会给 MSG 包的后期维护带来太多麻烦?

@yihui
Copy link
Owner

yihui commented Jul 23, 2020

这个好办,绕过 demo() 即可,这样就不必担心 CRAN 警察了。比如 shiny 就有自己的 shiny::runExample()。这样你把那些示例代码放到 inst 目录下任何一个子目录下即可,比如 inst/examples,下面放一个个 .R 脚本。然后 MSG 包里提供一个 book_example() 函数,跑 source() 即可。

如果是大段代码的例子,又不需要读者读懂代码,可以这样办。对于小段的例子,或者是源代码比较重要的例子,我觉得把源代码塞在书里也未尝不可。

@pzhaonet
Copy link
Contributor Author

pzhaonet commented Jul 24, 2020

嗯,也就是说,demo/ 里的脚本会被 CRAN 审查,而 inst/ 里的不会?

要是 demo/ 里没那么多鸡毛蒜皮条条框框限制的话,我觉得还是尽量用 demo() 函数调用。这样读者画图前就不必加载 MSG 包了,书稿现在涉及 demo() 的地方也不用改成 book_example()。

最后一个,是的,现有书稿里的源代码暂时保留。读纸书的时候手边未必有电脑来运行 demo() 看源码,这时纸书里的代码还是很有用的。现在就是担心篇幅——出于印刷成本和市场的考虑——已经400页了,这还不包括 shiny 节、plotly 节以及我准备在图库举例时添加对 ggplot 里各种函数的介绍。如果不得不缩减篇幅,大段的代码是个下狠手的地方。别的地方实在舍不得。

@yihui
Copy link
Owner

yihui commented Jul 24, 2020

我不知道 R CMD check 是否检查 demo/ 下的代码,感觉应该是不检查,我唯一不确定的就是中文字符是否会有问题,不过这个应该容易验证,我一会儿试一下。

@yihui
Copy link
Owner

yihui commented Jul 24, 2020

不能用中文字符,否则会有警告:

* checking package subdirectories ... WARNING
Demos with non-ASCII characters:  ChinaPop.R
Portable packages must use only ASCII characters in their demos.
Use \uxxxx escapes for other characters.

得用转义符,像这里面的中文字符一样:https://github.com/yihui/MSG/blob/master/demo/ChinaPop.R

@pzhaonet
Copy link
Contributor Author

转义符太不人道了。偶尔几个字符还行,而我是想逐行加中文注释给初学者理解代码用的。

我想起来了:以前我的做法是把中文长句写到 inst/ 某个文件里,用到的时候就读进来。比如 sinx 包涉及中文语录的地方就是这么干的。而写 pinyin 包的时候,汉字转拼音函数的 example 字段不允许用中文——一个用来处理中文的包,你不让我拿中文举例子,那么例子有啥意义?从此对 CRAN 累觉不爱。

那我就写到 inst/ 里,弄个函数调用吧。book_example() 读者敲起来太长,不如就叫 msg()

msg <- function(fig = "AgriComp"){
  source(system.file("examples", paste0(fig, ".R"), package = "MSG"))
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants