在使用R 语言的大部分用户中,RStudio 都是首选的IDE。凭借其完善的功能和特性,RStudio 似乎成了R 语言理所当然的选择。不过一些时候,我们可能并不需要特别多的复杂功能,而且我个人不是很喜欢RStudio 定制性很差的编辑器界面。在经过尝试之后,我决定使用VSCode 来挑战RStudio 的权威。

安装VSCode 和R

对于一些常用RStudio 来处理R 语言项目的用户来说,其他编辑器可能有些陌生。VS Code 是由微软开发的一款通用代码编辑器,除了更高的颜值之外,还支持几乎所有主流语言的代码高亮、代码补全、自定义主题和快捷键、Git 支持等等专业特性。通过大量的扩展插件,VSCode 可以完成很多不同的任务,其通用性可以保证在一个编辑器之内完成各种不同语言的项目,提高自己的工作效率。

当然,安装好VSCode 后,不要忘记安装R 核心程序

安装所需要的插件

如果你曾经在VSCode 中使用过Python 插件,实际上只需要微软出品的这一个插件就差不多可以开始工作了。但作为可怜的小众语言,R 的插件并不是官方开发,而是由第三方开发者贡献的。这也导致配置一个尚可的R 环境需要从四处安装不同的东西,才能开始工作。其中细琐事项甚多,又缺乏完善的教程方法,令人望而生畏。这也是我写这篇文章的初衷。

插件一:R support for Visual Studio Code

这是R 语言运行的核心插件,用来运行R 文件或运行所选行、提供语法高亮、data.frame预览、代码片段支持以及一些R 程序包的开发支持。安装完成后,便可以通过快捷键(默认为⌘+Enter)将编辑器中的所选行发送至R Console 运行,使用方法与RStudio 无异。但是单单安装这一个插件,却发现很多代码不能自动补全,尤其是来自第三方包的命令。这对强烈依赖第三方包的R 简直是致命的。这时就需要安装另外的一个插件。

在VSCode 中运行当前R 命令行
在VSCode 中运行当前R 命令行

插件二:R LSP Client

LSP 是Language Server Protocol 的缩写。简单来说,LSP 为不同语言在不同编辑器或IDE 中的自动补全、查找定义、悬停查看函数文档等功能搭建了桥梁,使得开发者可以减少针对不同语言和不同编辑器的重复开发。对用户来说,使用这一功能意味着可以获得更好的自动补全、查看帮助文档等特性。由于LSP 本身也是微软的项目,在VSCode 中的使用体验也会更好一些。R LSP Client 便是R 语言在这方面的实现,通过安装这个插件,可以弥补自动补全等功能的不足。

但有些使人迷惑的是,即使安装了这个插件,你会发现自动补全依然没有出现。实际上,插件只是在编辑器一侧提供了实现LSP 的条件,而在R 语言一侧还需要另外的包——languageserver——来完成搭接。在R 环境中运行如下安装指令:

install.packages("languageserver")

然后重启一下VSCode,整个LSP 的功能就可以实现了。

使用LSP 特性完成函数帮助和自动补全
使用LSP 特性完成函数帮助和自动补全

插件三:rtichoke(现更名为radian)

注(2019.03.23):经评论区用户@锆文 的提醒,目前rtichoke 更名为radian,但以下配置步骤并无变化,请各位悉知~如果配置过程中遇到版本不兼容的问题,可以参考其评论的安装方法尝试修正~

使用R 语言很多时候是把编辑器中的代码发送到Console 中运行,一些时候也需要直接在Console 中运行一些代码进行快速交互。RStudio 为Console 提供了语法高亮、自动补全等功能的加持,使得在Console 中也可以有比较方便的输入输出体验。然而R for VSCode 插件默认在Terminal 中调用R 进程,只会返回朴素的R Console 界面,高亮、补全通通不在考虑范围之内。

rtichoke 为这件事提供了新的可能。它给“性冷淡”的R Console 穿上一身华丽的新衣,也增加了自动补全、多行输入等等特殊能力。把它加入到VSCode 中,或是直接在终端中使用它运行R 代码,都是不错的替代方案。

有趣的是,rtichoke 本身是一个Python 项目,所以你需要安装有一个Python 环境(这里就不赘述Python 的安装方法),然后安装这个module。例如使用pip 进行安装,直接在终端中运行:

pip install -U rtichoke

等待安装进程结束后,就可以在终端中直接使用命令:

rtichoke

开始一个多彩的R 进程。

使用rtichoke 替代R Console
使用rtichoke 替代R Console

对接VSCode 与rtichoke

rtichoke 并不是VSCode 插件,它可以独立在终端中运行,但带来的问题就是无法在VSCode 中默认调用它。好在R for VSCode 插件提供了更换R Console 路径的设置,籍由此,我们可以完成二者的无缝对接。

打开VSCode 的设置项(默认为⌘+,),找到r 的设置。这里有三项相似的设置分别为r.rterm.linuxr.rterm.macr.rterm.windows,根据你的系统,找到需要更改的其中一个设置项。但在更改之前,需要知道rtichoke 在哪里。比较快捷的方式是在终端中运行:

which rtichoke

例如我这里返回了/Users/<username>/anaconda3/bin/rtichoke,将返回的路径粘贴在相应设置的值中,这一项设置即完成。

但重启VSCode 并以⌘+Enter 运行一个R 命令会发现VSCode 返回一个类似的错误:

终端进程命令“/Users/caoyue/anaconda3/bin/rtichoke --no-save --no-restore --no-site-file”无法启动 (退出代码: 2)

因为R for VSCode 插件在开启一个R 进程时,默认带入了三个选项--no-save--no-restore--no-site-file。然而根据rtichoke 作者的说法,rtichoke 的--no-save--no-restore已经作为默认选项故而无法再传入(相反你可以传入--save--restore)。如此,在设置中关闭--no-saveno-restore两个选项即可。在VSCode 的设置中,找到r 设置下的r.rterm.option,将后面不需要的两项注释掉或删掉即可。当然,你也可以在这里使用自定义的选项。

另外的一个问题是,你可能发现更换掉R Console 路径后,LSP 带来的效果不见了。这是因为Lanuage Server 指向的路径默认随着R Console 变动,而它无法识别rtichoke。我们通过将选项r.rpath.lsp 更改为r 程序的默认路径即可修复该问题(r 的默认路径在终端中运行which r 可得)。

到此为止,rtichoke 的配置工作结束。总结一下,设置项中会有如下的新设置(如果使用VSCode 新的GUI 设置界面,即是将冒号后的值粘贴到相应的设置框中):

{
    "r.rterm.mac": "/Users/<username>/anaconda3/bin/rtichoke",
    "r.rpath.lsp": "/usr/local/bin/R",
    "r.rterm.option": [
        // "--no-save",
        // "--no-restore",
        "--no-site-file"
    ]
}

注:VSCode 经典的设置采用JSON 模式,但目前推出了图形界面的设置。如果你不知道如何进行设置可以参照微软的文档

Bonus: 设置快捷键

R 语言有一些非常讨人厌的特性,比如赋值符号是<-。用两个字符赋值已经够繁琐了,按< 还需要去按Shift,搞不好下一个就按成_。RStudio 通过快捷键⌥ - 来输入它,我们可以通过VSCode 可以灵活自定义快捷键的特点,自己完成这一特性的实现。

打开快捷键设置(默认为⌘+K ⌘+S)并转到搜索框下的keybindings.json,在右侧的自定义快捷键部分追加如下的设置:

{
    "key": "alt+-",
    "command": "type",
    "args": {
        "text": " <- "
    },
    "when": "editorTextFocus"
}

这项设置非常好懂,key 为快捷键(加号仅作为连接符);command为命令,这里为type即输入;args 为参数,这里是输入的内容,即写在类型text 之后的<-when是规定了快捷键何时生效,这里规定为editorTextFocus,即当编辑器成为焦点时。

使用 <- 的快捷键
使用 <- 的快捷键

以此类推,可以为%>%等常用符号添加快捷键。更多VSCode 的快捷键设置可以参考微软的官方文档,通过自定义快捷键让VSCode 更加得心应手。

尾巴

诚然,在完成大型的R 项目中,VSCode 可能依然打不过RStudio,譬如整合的图形显示、帮助文档查询等等。但是寻找一个新的可能并在其中学得更多东西,固然不是一件坏事;在不同的场景下使用不同的工具,也可以带来意想不到的效果。何况VSCode 本身的可能性丰富多样,也具备更强大的通用能力,对于需要在R 和Python 两种环境下进行数据科学处理的用户可以带来更统一的体验。希望通过这篇文章可以将VSCode 中的R 配置更好地总结下来帮助需要的人,也欢迎大家来一起节流。