最近在用R的envcpt包和pheno包做时序分段,但在使用之前的其他工作都是在Python 2里做的,要避免完全两张皮的局面就需要用rpy2实现从Python中调用R,安装后需要额外配置环境变量,另外通过rpy2绘制的图目前也不能直接在Jupyter中显示。最后还处理了几个Jupyter Notebook导出PDF的问题,方便导出查看以前的笔记。
rpy2使用若干问题
环境变量配置
R_HOME设置到R-3.x.x即可,无需具体到bin/x64或者i386。如果提示找不到R.dll,不是路径的问题,而是Python的位数与R不一致导致,因此也无需将bin/x64加入Path变量。R_USER不能为空,虽然有帖子建议设置为rpy2包的安装路径,实际上任意文本均可。
在notebook中绘图
可以将R的绘图设备设置为Python中的二进制流[1, 2]。该功能从rpy2的2.8.x版本开始提供,但目前UCI LFD提供的Windows下Python 2的rpy2安装文件最新为2.7.x版本。虽然rpy2对Python 2的支持达到了2.8.x版本[3],但由于编译问题也无法简单地在Windows下使用。因此目前在Windows下在notebook中绘制R图像的方法是用Python 3安装高版本的rpy2绘制二进制流并在笔记本中显示,或者在低版本的R图像作为临时文件绘制到磁盘再在笔记本中显示。
nbconvert导出pdf若干问题
按照提示安装pandoc和MikTex后可以正常输出tex或者pdf文件,但是还是有一些影响观感的小问题。
代码/输出换行
由于Jupyter对代码和输出默认有手动换行的假设,因此实际使用中过长的代码行或者输出行会溢出页面边界[4]。对策是在Latex模板中加入强制的固定字符数换行或者调小相关文本的字体大小[5]。注意Markdown文本块不存在此问题,上述方案也只对代码和输出有效,对输出中的报错信息无效,可能是假设输出的内容中不应存在报错。
中文显示
Jupyter的导出功能是支持UTF-8文本的,但是由于默认字体的原因并不能显示非拉丁字母。如果有标题结构,其中的中文确实可以被PDF阅读器正常读取并显示。因此可以通过设置CJK回退字体解决[6]。注意字体名称不带后缀的斜体、粗体等字重标记,且名称必须与系统字体文件夹中一致,不一定是中文或者英文。
中文换行
文本部分本应自动换行,但是这对中文不起作用,这与Jupyter的导出无关,需要自行设定中文换行命令,加入模板。
1 | ((* block commands *)) |
有模板后可以在nbconvert包的安装目录中替换掉默认模板,也可先生成tex文件,再手动指定自定义模板进行PDF渲染[5]。
最后在翻rpy2绘图相关文档 时看到对ggplot的解释是对grammar of graphics的一种实现,这个理论在Springer出了两版专著,感觉对科技制图和地图可视化都有一点帮助,有时间可能看一看这个比较系统的理论,似乎比所谓的专题地图十种常用表示方法划分更科学。