ChrAlpha's Blog

用 Conda 管理 R 环境并配合 VS Code 优化数据分析代码体验

2024-11-24·笔记本

在使用 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-tidyverser-ggplot2等:

conda install r-tidyverse r-ggplot2

你可以在激活 Conda 环境的时候通过 which R 查看 R 的位置,后续配合 VS Code 时会用到。

如果有 RMarkdown 或者在 Jupyter Notebook 调用 R 的需求,需要安装 r-rmarkdownr-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 插件也建议安装 radianhttpgd 以提升体验:

  • 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

用 Conda 管理 R 环境并配合 VS Code 优化数据分析代码体验
本文作者
ChrAlpha
发布日期
2024-11-24
更新日期
2024-11-24
转载或引用本文时请遵守 CC BY-NC-SA 4.0 许可协议,注明出处、不得用于商业用途!
CC BY-NC-SA 4.0