昨天bjt大哥写了一篇很有启发性的文章,然后在评论中问曰:“yixuan 最近没怎么更新博客啊!”答曰:“寒假回家堕落了……”
这是真话。一回到家,就彻底没了上进的念头,什么东西都不想学,也什么东西都不想写了。经大哥这一提醒,才发现日子确实不能这么过啊,总得逼着自己找点事做。突然想起回家前在学校折腾着编了一个小程序,但还没有完成,于是今天就花了些时间把它完善了一下,想请大家帮忙测试测试,找点BUG什么的。:)
程序暂且取名叫Rhelper,其作用是让2.10.0以上的R重新焕发chm的风采。自从R升级到2.10.0后,其帮助文件都是动态生成的,原来的chm格式不再支持,这使得很多useRs一时难以适应。纯文本的帮助没有函数之间的超链接,因此在See Also的时候会比较麻烦,得重新去找;html帮助是一个不错的选择,但也有朋友说不如chm的直观,因为后者在左侧列出了包中的所有函数,可以快速查看相关的内容。
鉴于此,我之前便萌生了一个想法,就是把帮助文件动态生成的特性与chm的优点结合起来,为2.10.0以上版本的R做一个简便易用的帮助系统。下面是一幅程序运行的截图:
程序主要由两部分组成,一部分是外部程序,用以打开动态生成的html文件,另一部分是R中的函数,用来调用这个外部程序。程序可以从这里下载,“安装”的办法是把压缩包里的Rhelper.exe和libgcc_s_dw2-1.dll复制到R安装目录的bin文件夹中,然后在R中运行Rhelper.R中的函数。如果准备经常用的话,可以把这个函数加入到etc/Rprofile.site中,这样每次打开R的时候程序就会自动把Rhelper()
这个函数载入,用的时候只需Rhelper(topic)
,比如Rhelper(par)
就可以了。
目前这个程序已经实现了帮助文件中函数超链接的跳转,但一些外部的链接(比如链接到网站)和最底下的索引页链接还暂时无法实现。此外一个问题是这个程序的打开速度可能会比R自己的帮助慢零点几秒,因为这个程序调用了R中的一些函数,在用这些函数时相当于要新打开一个R进程。
我不太确定这个程序在其它机器上能不能正常运行,如果没有什么大问题的话,我准备发到COS上去,看看大家的意见。如果程序有BUG,敬请提出,谢谢!
感谢lanfeng:之前我还不知道,原来图片是用绝对路径放到程序中的,所以之前的程序在其它机器上没办法显示两个图标。现在还不知道怎么把图片编译到程序中,总感觉放两张图太累赘……
20100129更新:图标的问题搞定了,现在无需那两张png就可以显示图片了。lanfeng碰到的问题我暂时没有遇到,所以不知道应该怎样修改程序,但我想确定一下,你的那些包是不是最新版本的?如果是比较老的,还带有chm帮助的,可能会有些问题。此事还有待查证。
回谢老大的问题:默认的加载页面是我胡乱设定的,因为是Rhelper嘛,所以就选择help()
函数的帮助了。:)
生成html的方法是用tools
包里的tools:::fetchRdDB()
函数和Rd2HTML()
函数,前者从每个包的help/*.rdb数据库中抓出Rd对象,后者把这个Rd对象转成html。函数的使用方法可以看R源码包src/library/utils/R/help.R的第237行。
函数跳转就是读取超链接地址中提供的包名和Rd文档名,然后用类似的方法生成html。不过有时候包名好像有问题,比如graphics
包里链到grDevices
包的函数,其路径还是graphics
,遇到这种情况时只能再用一次help()
来搜索。
这个程序是用开源的GUI库wxWidgets写的,里面提供了显示html的控件,也正是因为这个我才有打算编出这个程序。不知道wxWidgets跟gWidgets有没有关系,如果有联系的话可能移植起来会方便些。
源代码在这里下载。(纯业余,不知道怎么生成标准的源码结构,就把Code::Blocks的工程文件发上来了。工程可以直接用Code::Blocks打开,但里面的一些依赖库的路径得改。)