2019年底(其实也就是半个多月之前)听了 renkun 大神在上海 R 会议的一个分享,分享主题是「Rstudio vs VSCode」,然后他紧接着又写了两篇使用 VSCode 进行 R 开发的博客。仔细了解之后,感觉自己有救了。

之所以这么说,是因为自己一直有个需求得不到很好的满足:在本地方便的开发部署在远程服务器上的 Shiny 应用。

具体一点说,因为我的 Shiny 需要依托一些 Linux 下才能运行的程序,且这些程序对内存有要求,就导致我无法在 Windows 本地使用 WSL 进行测试和开发。而之前使用 VSCode Remote SSH 让本地 VSCode 连接上服务器本身没问题,但是早期 R Console 运行得到的各种结果本身却无法在 VSCode 中方便的查看,总是需要跳出额外的各种窗口。

当然,使用 Rstudio Server 是一个选择,但在实际使用中会有比如单一 session,时常未响应,编辑器各种不顺手等等问题。

随着几位大神的开发加持,现在使用 VSCode 愉快地进行远程 R 语言开发不仅成为了一种可能,而且还非常香,在使用体验上基本不输 Rstudio,而且很多小细节上更加贴心。

为什么要用 VSCode 写 R

大家可能会有一个非常真诚的疑问,Rstudio (server) 它不香吗,写 R 为什么还要用其它编辑器? 下面这张幻灯片来自 renkun 在会议上的分享,基本说明了问题。

就像上图总结的,RStudio 好用,几乎是所有 R 用户的最佳选择。但同时像上文提到的,时不时的无响应带来的各种不稳定,单 session 操作等又让人苦恼。

你可能会有这样的感受,使用 Rstudio 的过程中因为其本身需要一直和服务器保持通信,live R session 和语言服务又无法分离,当 Console 中运行了一个耗时或者耗内存的命令之后,整个 Rstudio 就无法进行任何操作了。

那 VScode 呢?这个编辑器本身的优点不必多说,虽然之前对 R 的支持没那么友好,不过最近几个月在 VSCode 中使用 R 有了重大的体验升级,这主要体现在两个方面。

  1. R Language Server 在后端的加持
  2. vscode-R 插件在前端的重大迭代

R Language Server

首先说 R Language Server,R Language Server 依托于 Language Server Protocol(可以让任何语言在任何编辑器上得到很好的语法支持)。现在的 R Language Server 在 VScode 中已经非常好的支持了多种鼠标悬停内容展示、帮助文档展示、自动补全、文本高亮以及代码格式化等功能。

R Language Server 和 Rstudio 相比差别最大的一点在于前者是真正的静态分析(static analysis),指在不运行程序的条件下,进行程序分析的方法。也就是说所有功能的实现都无需运行代码,对代码进行的分析仅仅依赖代码本身。而且它的语言服务完全脱离于 R session,即便在 R session 非常繁忙的情况下依旧可以提供服务。

接下来仅仅列举几个在 Rstuido 中不是很方便实现或者无法实现的功能。

  • 鼠标悬停即显示函数定义和文档,无论对应的包是否已经加载。(箭头处为鼠标位置,下同)
  • 鼠标悬停在变量上,直接展示变量类型信息

这个就类似于 Rstuido 中 environment 那个小框的功能,但是更方便直观。

  • 自动高亮文档内所有同一变量
  • 选中代码,自动格式化,例如添加空格等。

vscode-R 新增 Session Watcher

vscode-R 插件则在最近的更新中新增了一个 Session Watcher 功能,即便还在测试阶段这个功能也足以让人激动。它实现了在 VSCode 中实时展示各种变量的需求View() 的时候再也不会有各种弹窗了。文字不好描述,直接上图。

  • 查看 data.frame

如下图右,直接查看data.frame 内容,支持搜索。

  • 展示 ggplot 出图
  • 展示 htmlwidgets

通过SSH连接远程服务器

接下来简单介绍如何实现在本地 VScode 中实现远程 R 开发。

首先要实现的自然是远程操作,这里以使用 PC 通过 SSH 连接远程 Linux 服务器为例。

我们默认服务器已经开通了ssh服务,然后本地 PC 已经正确安装了 Windows OpenSSH Client。

安装插件 Remote-SSH

然后在命令行面板中找到 Remote-SSH 相关命令,可以直接选择链接服务器,也可以选择打开配置文件。这里我们选择打开配置文件进行简单的配置。

在配置文件中可以输入相应的用户名 IP 地址以及端口等信息。写法如下图所示,写好保存即可。

再选择连接Host的命令,就会看到之前我们已经保存好的 Host 选项。

点击对应的 Host,然后输入密码即可。

如果为了方便不想每次都输入密码,可以使用 SSH key 配置服务器和本地的公钥私钥,这里不再展开。

连接成功之后,VSCode 左下角就会显示一个远程连接的标志,同时你还可以直接在 TERMINAL 中打开一个 shell (我用的是 zsh),就像平时使用类似 Xshell 的工具一样直接进行各种操作。

配置R语言开发环境

完成了远程连接服务器的工作,接下来是在 Remote 状态下简单进行 R 相关的配置。

首先安装两个必备的插件,R 和 R LSP。然后还需要在服务器的 R 中安装一个R包 languageserver。

install.packages("languageserver")

随后在设置界面中进行几个关于 R 的设置。

首先是设置Linux下的R路径,如果使用系统自带的 R 应该是/usr/bin/R ,如果是使用自己目录下,例如使用conda安装的R则指定对应的 R 路径。这里推荐使用 Radian 替代 R,所以我的 R 路径就指向了使用conda安装的radian。如下图所示。

如果使用 Radian的话,则需要勾选 Bracketed Paste 选项。

如果希望使用服务器上的一些 R 配置,例如 .Rprofile和 .Renviron 文件,那么 Rterm Option 处就不要加什么其它参数,如果不希望使用则可以酌情添加--no-init-file 或者 --no-environ 等参数。

安装插件。在 Rstudio 中路径的自动补全功能非常方便,在 VSCode 中则可以通过插件 Path Autocomplete 来实现这个功能。

至此,就完成了在 VSCode 中使用 R 所需要的一些基本配置,可以开工搬砖。

最终使用效果

直接上截图。

  • 左侧为服务器对应的文件目录,可以直接点击查看编辑
  • 中间是 R 脚本,可以开心的写代码
  • 右边是对应的网页工具,直接查看效果
  • 下面是连接到服务器的终端,可以在 zsh、R 以及 python 等终端任意切换。也可以同时打开多个不同的 R 终端进行不同任务,互不干扰。

扩展资料: