用 Conda 管理 R 环境并配合 VS Code 优化数据分析代码体验
在使用 R 的很多时候,明显感觉 R 并不像一门编程语言,而是更像命令行中的 Excel。毕竟这门语言的设计初衷就是为了数据分析。对于从未接触编程的用户来说,通过 RStudio 一站式解决的烦人的环境配置等问题,做到上手即用。但是对于有编程经验的用户来说,RStudio 的许多功能──例如 Copilot、Intellisence、Linter、Git 集成等──相较于 VS Code 还是孱弱太多。
此外,虽然 R 语言也有 venv 的概念,将不同项目的依赖隔离开来,避免冲突,但是这和完全和 Conda 独立。而在实际分析中,R 的统计学习、可视化优势与 Python 的深度学习、更广的扩展性相辅相成,往往需要借助 reticulate
(R 调用 Python)或 rpy2
(Python 调用 R)同时使用两者。因此,也同 Python 一样,我移除了全局的 R 环境,完全使用 Conda 管理 R 以及其配套 Python 环境。
遗憾的是,VS Code 的 R 插件远不如 Python 插件那么强大,无法实现类似「Python: Select Interpreter」选择特定的 Conda 环境并激活对应位置的 R 环境。我们只能在 VS Code 中手动设置 PATH 以实现类似功能。
0. 卸载全局 R 环境
如果你在 WSL 中使用 R、RStudio Server,可以通过下面的命令卸载全局的 R 环境:
sudo rstudio-server stop
sudo apt remove rstudio-server -y
sudo apt remove -y r-base r-base-core r-recommended r-base-dev
sudo apt autoremove -y
R 的 APT 源可以先留着,反正不至于导致调用错误的 R 环境。
如果你是在 Windows 或 macOS 通过 RStudio 使用 R,直接通过 GUI 卸载 RStudio 和 R 即可。
1. 在 Conda 中安装 R
Anaconda 文档中有关于在 Conda 中使用 R 的说明──Using R language with Anaconda,这其实是一个常见的用法。
你可以通过下面的命令创建一个全新包含 R 和常用包的环境:
conda create -n r_env r-essentials r-base
# micromamba 由 C 程序编写,速度更快
# https://mamba.readthedocs.io/en/latest/user_guide/micromamba.html
# micromamba create -n r_env r-essentials r-base
conda activate r_env
绝大多数 R 包也都可以通过 Conda 安装,包名前缀为 r-
,例如 r-tidyverse
、r-ggplot2
等:
conda install r-tidyverse r-ggplot2
你可以在激活 Conda 环境的时候通过 which R
查看 R 的位置,后续配合 VS Code 时会用到。
如果有 RMarkdown 或者在 Jupyter Notebook 调用 R 的需求,需要安装 r-rmarkdown
和 r-irkernel
:
conda install -c conda-forge r-rmarkdown r-irkernel
2. 配置 VS Code
R 控制台连接 VS Code 需要 languageserver``,languageserver
同时会带有 R 的语法检查、代码格式化等功能。同样的,这个包可以通过 Conda 安装:
conda activate r_env
conda install -c conda-forge r-languageserver
同时 VS Code 的 R 插件也建议安装 radian
、httpgd
以提升体验:
radian:
一个现代 R 控制台,修正了官方 R 终端的许多限制,并支持语法高亮和自动完成等许多功能httpgd
: 一个 R 软件包,用于提供一个图形设备,通过 HTTP 和 WebSockets 异步提供 SVG 图形。 VS Code R 扩展的交互式绘图查看器需要使用该软件包。
conda install -c conda-forge radian r-httpgd
注意这里的 radian
不需要再加 r-
前缀。
随后修改下述设置项:
{
"r.bracketedPaste": true,
"r.rterm.linux": "${userHome}/micromamba/envs/r_env/bin/radian",
"r.rpath.linux": "${userHome}/micromamba/envs/r_env/bin/R",
"r.rterm.mac": "${userHome}/micromamba/envs/r_env/bin/radian",
"r.rpath.mac": "${userHome}/micromamba/envs/r_env/bin/R",
"r.rterm.option": [
"--no-save",
"--no-restore",
"--no-site-file",
"--r-binary=${userHome}/micromamba/envs/r_env/bin/R"
],
"r.libPaths": [
"${userHome}/micromamba/envs/r_env/lib/R/library"
],
"r.plot.useHttpgd": true,
"[r]": {
"editor.defaultFormatter": "REditorSupport.r"
},
"files.associations": {
"*.rmd": "rmd"
},
}
这里路径只针对 Linux 和 macOS,Windows 请尽量在 WSL 中使用 R,WSL 下设置遵循 Linux。VS Code 路径并不认可 ~
等变量,需要使用 ${userHome}
等 VS Code 变量 代替。
r.rterm
用于指定 R 控制台的位置,r.rpath
用于指定 R 的位置,如果你选择radian
作为 R 控制台,将前者指向radian
,后者仍然指向R
。r.rterm.option
用于指定 R 控制台的启动参数,最好加上--r-binary
参数指定 R 环境的位置。r.libPaths
用于指定 R 包的位置,如果全在 R 控制台中操作,不修改似乎也没问题。r.plot.useHttpgd
用于指定是否使用httpgd
展示图表,可以在 VS Code 中实现类似 RStudio 的交互式图表展示。editor.defaultFormatter
用于指定 R 代码的格式化工具,这里使用 R 插件自带的格式化工具。files.associations
:VS Code 默认会将.Rmd
文件识别为普通 Markdown 文件,这里需要单独指明
注意到这里通过各种 PATH 的设置,实现了选择特定的 Conda 环境并激活对应位置的 R 环境,建议在 User 设置一个通用的 R 环境,而在 Workspace 还可以设置单独特定的 R 环境,以实现不同项目使用不同的 R 且无需每次手动切。
其他注意事项
关于 RMarkdown 的导出问题,虽然在 Conda 环境中安装 r-rmarkdown
会自动处理好依赖,例如 Pandoc 等。但是注意到上面也只是通过 PATH 的设置实现了 R 的环境切换,终端和其他地方并未真正激活相应的 Conda 环境,因此在 VS Code 中 Knit RMarkdown to PDF 可能发现找不到 Pandoc。
一般 TeX Live 和 Pandoc 这些文档工具,我已经在全局环境中安装一份。倘若非要用 Conda 环境中的版本可以通过修改 VS Code 的 r.rmarkdown.knit.command
Knit 命令,在命令前面添加 RSTUDIO_PANDOC
环境变量,指向 Conda 环境中的 Pandoc 位置。但是这里我试过不能使用 ${userHome}
等变量,只能写绝对路径,这样就失去了通用性,不推荐这样做。
{
"r.rmarkdown.knit.command": "Sys.setenv(RSTUDIO_PANDOC='/home/username/micromamba/envs/r_env/bin/pandoc'); rmarkdown::render"
}
如果你希望自行开启的 R 控制台也能连接 VS Code,可以通过用户目录下的 .Rprofile
文件设置初始化:
if (interactive() && Sys.getenv("RSTUDIO") == "") {
Sys.setenv(TERM_PROGRAM = "vscode")
source(file.path(Sys.getenv(
if (.Platform$OS.type == "windows") "USERPROFILE" else "HOME"
), ".vscode-R", "init.R"))
}
并选择性勾选 r.alwaysUseActiveTerminal
。