Azure Databricks 上的 renv
renv 是一个 R 包,使用户能够管理特定于笔记本的 R 依赖项。
通过使用 renv
,你可以为项目创建和管理 R 库环境,将这些库的状态保存到 lockfile
,然后根据需要还原库。 结合使用这些工具有助于使项目更加独立、更具可移植性且更具可重现性。
基本 renv
工作流
本节内容:
- 安装
renv
- 使用预安装的 R 库初始化
renv
会话 - 使用
renv
安装其他包 - 使用
renv
将 R 笔记本环境保存到 DBFS - 通过 DBFS 中的
lockfile
重新安装renv
环境
安装 renv
可以将 renv
安装为群集范围内的库或笔记本范围内的库。 若要将 renv
安装为笔记本范围内的库,请使用:
require(devtools)
install_version(
package = "renv",
repos = "http://cran.us.r-project.org"
)
Databricks 建议将 CRAN 快照用作存储库来固定包版本。
使用预安装的 R 库初始化 renv
会话
使用 renv
的第一步是使用 renv::init()
初始化会话。 设置 libPaths
将默认下载位置更改为 R 笔记本范围内的库路径。
renv::init(settings = list(external.libraries=.libPaths()))
.libPaths(c(.libPaths()[2], .libPaths())
使用 renv
安装其他包
现在可以使用 renv
的 API 来安装和删除 R 包。 例如,若要安装最新版本的 digest
,请在笔记本单元格内运行以下命令。
renv::install("digest")
若要安装旧版的 digest
,请在笔记本单元格内运行以下命令。
renv::install("digest@0.6.18")
若要从 GitHub 安装 digest
,请在笔记本单元格内运行以下命令。
renv::install("eddelbuettel/digest")
若要从 Bioconductor 安装包,请在笔记本单元格内运行以下命令。
# (note: requires the BiocManager package)
renv::install("bioc::Biobase")
请注意,renv::install
API 使用 renv 缓存。
使用 renv
将 R 笔记本环境保存到 DBFS
在保存环境之前,请运行一次以下命令。
renv::settings$snapshot.type("all")
这会将 renv
设置为对安装到 libPaths
中的所有包(而不仅是当前在笔记本中使用的包)拍摄快照。 有关详细信息,请参阅 renv 文档。
现在,可以在笔记本单元格内运行以下命令以保存环境的当前状态。
renv::snapshot(lockfile="/dbfs/PATH/TO/WHERE/YOU/WANT/TO/SAVE/renv.lock", force=TRUE)
这将通过捕获安装在 libPaths
上的所有包来更新 lockfile
。 此命令还将 lockfile
从本地文件系统移动到 DBFS,这样一来,即使终止或重启群集,它也仍然存在。
通过 DBFS 中的 lockfile
重新安装 renv
环境
首先,请确保新群集正在运行的 Databricks Runtime 版本与你首次创建 renv
环境时的 Databricks Runtime 版本相同。 这可确保预安装的 R 包完全相同。 可以在每个运行时的发行说明中找到这些运行时的列表。 安装 renv 后,在笔记本单元格内运行以下命令。
renv::init(settings = list(external.libraries=.libPaths()))
.libPaths(c(.libPaths()[2], .libPaths()))
renv::restore(lockfile="/dbfs/PATH/TO/WHERE/YOU/SAVED/renv.lock", exclude=c("Rserve", "SparkR"))
这会将 DBFS 中的 lockfile
复制到本地文件系统,然后还原 lockfile
中指定的任何包。
注意
若要避免出现缺少存储库的错误,请从包还原中排除 Rserve
和 SparkR
包。 这两个包预安装在所有运行时中。
renv
缓存
renv
的一项非常有用的功能是它的全局包缓存,这在群集上的所有 renv
项目间共享。 它可以加速安装时间并节省磁盘空间。 renv
缓存不会缓存通过 devtools
API 或带有除 pkgs
外任何参数的 install.packages()
下载的缓存包。