rpy2使用和jupyter导出若干问题

最近在用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
2
3
4
5
6
7
8
9
10
11
12
((* block commands *))
% https://tex.stackexchange.com/questions/43599/turning-chinese-line-breaks-on-and-off
\XeTeXlinebreaklocale "zh"

% https://github.com/jupyter/nbconvert/issues/786
\usepackage[Latin,CJK]{ucharclasses}
\usepackage{fontspec}
% \newfontfamily{\mynormal}{Latin Modern Roman}
% \setDefaultTransitions{\mynormal}{}
\newfontfamily{\mycjk}{Source Han Serif SC}
\setTransitionsForCJK{\mycjk}{}
((* endblock commands *))

有模板后可以在nbconvert包的安装目录中替换掉默认模板,也可先生成tex文件,再手动指定自定义模板进行PDF渲染[5]。

最后在翻rpy2绘图相关文档 时看到对ggplot的解释是对grammar of graphics的一种实现,这个理论在Springer出了两版专著,感觉对科技制图和地图可视化都有一点帮助,有时间可能看一看这个比较系统的理论,似乎比所谓的专题地图十种常用表示方法划分更科学。