Emacs远程连接R

本地的R脚本,远程执行

从事生信工作,已经形成了对R语言的重度依赖,Rstudio作为专注于R的IDE拥有强大的优势,但是我还是更习惯于Emacs的ESS的操作。其实之前就遇到过一个挺有意思的问题,如何用本地的Emacs去编辑并执行服务器上的R脚本。一个很显而易见的方法就是用Emacs的Tramp SSH连接到服务器,打开R脚本,这个时候ESS会自动使用远程服务器的R来运行。但是问题来了,在画图的时候这个远程的R进程并不能通过X11把图传回,所以会自动存储为Rplot.pdf于工作目录。Google了很久,找到了以解决方案:

  1. 打开本地shell/eshell (M-x shell/eshell)
  2. 在打开的shell中连接远程服务器(ssh -X user@remote.machine.ip 或 ssh -Y)并运行R
  3. 使用ESS remote(M-x ess-remote)
  4. 打开本地或远程(Tramp mode)的R脚本
  5. 使用C-c C-n(在CUA mode关闭情况下可使用C-Enter)或C-c C-c逐行或区域执行

在上述过程中,顺序其实不是很重要,唯一需要注意的是如果R脚本在服务器上,一定要先开启一个本地的shell,要不然Emacs会默认使用远程机器的shell。

为了简化此过程,我写了一个函数并把它定义给快捷键C-c C-r(写在init.el或.emacs文件中):

(defun spawn-ess-remote (login)
  "connect to remote server and open ssh"
  (interactive "sUser login (uname@server.ip): ")
  (pop-to-buffer (get-buffer-create (generate-new-buffer-name "Remote-R")))
  (shell (current-buffer))
  (process-send-string nil (format"ssh -Y %s \n" login) )
  (process-send-string nil "R\n")
  (ess-remote nil "R"))
(global-set-key (kbd "C-c C-r") 'spawn-ess-remote)

Related

comments powered by Disqus