解名缰 鸟倦飞

R2SWF诞生记(二)

2013 年 12 月 08 日 | 分类于 R

哦,你问我后来怎么样了?其实就是下面这个计划:

换句话说,R2SWF 包就在这个时候诞生了。

后面的过程并非一帆风顺。当时发现了另外一个生成 SWF 的程序 swfmill,觉得它的用法更简单,而且支持 SVG 图形,于是曾试图把 R2SWF 构建在它上面。但后来磕磕绊绊,带来的麻烦远大于带来的好处,只好再老老实实切换回 libming,直到现在没再改过。

而这之后的故事,最惊心动魄的莫过于与 CRAN 之间沟通,摩擦,妥协,最后欣然接受的过程了。

事情的起因是提交0.5版的时候,我像以前那样给 CRAN 发邮件,结果被告知不合要求,比如邮件的标题要有特定的格式,邮件里面不能有 HTML ,R包的检查更加严格了等等。这时候距我上次提交R包已经有一年多,完全没有意识到现在的标准已经严格了太多。来来回回几次修改和邮件沟通后,终于把包放到 CRAN 上了,结果第二天,就收到了来自 CRAN 的通知,作者是R包开发者都必定刻骨铭心的那位大人。

邮件的大意是这个包被 CRAN 撤了,原因有好几个,首先是因为安全原因不能包含 zliblibpng 的源代码,其次是我被怀疑造假(意思是我包含了其他软件的源代码但没有署名,尽管那些代码都是开源和 GPL 的),再次是发现以前的版本也有这个问题,所以不能留你了。总之言辞比较激烈,让你根本不想读第二遍。

当时我心里面那个郁闷啊,而且特别不舒服的是 CRAN 上还留有 R2SWF 的页面,只不过上面写的是该包违背 CRAN 政策被撤了,原因是“不诚实的署名”。那感觉就像是被钉在了耻辱柱上,怎么看怎么觉得不爽。不过既然有问题,那就改吧。本来我在软件包里面加入所有源代码就是为了让 Windows 和其他系统一样可以方便地编译,现在不让这么做,只好又走回很久以前的老路,对 Windows “特别关照”一下。作者署名和版权信息,往R包里加就是,列了一长串的名字和一长串的 Copyright(C) xxxx-xxxx。之后来来回回又是几通邮件,一会儿说是我把版权和许可证的概念弄混了,一会儿说是包含的许可证类型不兼容,总之为了达到 CRAN 的标准,我把那些版权信息和开源许可证研究了个遍,最后花在文字上的功夫比花在代码上的时间多多了。

折腾了这许久吧,也不是没有收获。首先还是很高兴新版的 R2SWF 上线了,当前 R2SWF 包最大的一个更新就是加入了原生的 SWF 设备支持。之前用 R2SWF 生成动画,本质上是将其他类型的图片一幅一幅接起来,转换成 Flash 动画。这样很麻烦,而且效率不高,同时在转换的过程中还容易出错。而现在的 R2SWF 提供了跟其他图形设备一样的接口,于是你可以像生成 PDF 文件一样来创建动画。比如下面的代码

library(R2SWF)
swf()
plot(1)
plot(2)
dev.off()

会创建一个两帧的 Flash 动画,每一个新的 plot() 语句就代表了新的一帧。此外,这个 SWF 设备还加入了完整的字体支持,意思是你可以使用任何一个 ttf/ttc 类型的字体来绘制文字,包括对中文字体的支持,就像下面这样。

关于这些 R2SWF 的新特性和用法,我想会另写一篇博客来说明。

最后说一下对当前 CRAN 这种更严格的政策的想法,我觉得是有利有弊吧。弊处不用多说,门槛提高会让开发者的积极性大打折扣,而且会花很多时间在非代码的工作之上,我自己的经历就是例子。但平心而论,更严格的标准意味着对代码和整个软件包的质量有了更高的要求,现在不再是写完论文后用R实现一下算法就能往 CRAN 上发了。此外 CRAN 严格的署名制度会让你在使用其他人的成果时更加小心,这也是对知识产权的尊重。

最后是一些关于版权和许可证的经验教训,如果想写R包发到 CRAN 上,但使用了其他人写的代码,有几点需要注意:

  • 一定要在 DESCRIPTION 文件的 Author 栏加上那些代码的作者。如果人太多,可以写在一个名为 AUTHORS 的文件里,塞到源码包的 inst 文件夹下。
  • 如果那些代码包含版权信息,应该把它们写在一个名为 COPYRIGHTS 的文件里,同样塞到 inst 文件夹下。
  • 注意许可证的兼容性。引用了 GPL 的代码,就必须把整个包变成 GPL 的。如果包含的代码是 GPL-2 的,整个包的许可证就必须是 GPL-2,不能是 GPL-3。许可证为 GPL-2 的软件包不能包含 Apache 2.0 的代码,但 GPL-3 可以。许可证为 Apache 2.0 的包不能包含 GPL 的代码,这意味着,你的软件包不能同时包含 GPL-2 和 Apache 2.0 的代码。你已经绕晕了对不对?其实我也是,都是被逼的。