在 rstudio-server 中使用 R 包的不同版本
適用于 ubuntu 20.04
ubuntu 20.04 是 “西柚云” 主要使用的操作系統(tǒng) 西柚云官網(wǎng)
原理
R 不支持在一個(gè)目錄下安裝同一個(gè)包的多個(gè)版本,在加載 R 包時(shí),它按照系統(tǒng)中配置的 libpaths 的優(yōu)先級(jí)從高到低查找,在某個(gè) libpath 下找到這個(gè)包后,將這個(gè)包加載到環(huán)境中,即使后面找到這個(gè)包的其他版本,也不會(huì)再次加載了。(R包加載機(jī)制)
如在執(zhí)行 library("uwot") 時(shí),R 就會(huì)依次搜索 libpath 找到 uwot 的位置,即使 libpaths 中有多個(gè) uwot,它找到第一個(gè) uwot 后,就將 uwot 加載到環(huán)境中,而不會(huì)再加載后續(xù)找到的 uwot 包到環(huán)境中了。
不過(guò)我們可以將當(dāng)前加載到環(huán)境中的 uwot 這個(gè)包 unload,然后加載其他 libpath 中的 uwot 包。后面我會(huì)演示這個(gè)步驟。(切換 uwot 版本的原理)
# 查看系統(tǒng)中配置好的 libpath 輸出,按照優(yōu)先級(jí)從高到低的方式輸出
.libPaths()
# 示例輸出:
[1] "/home/txb/R/x86_64-pc-linux-gnu-library/4.2"
[2] "/usr/local/lib/R/site-library"
[3] "/usr/lib/R/site-library"
[4] "/usr/lib/R/library"
如圖:/home/txb/rpackage 目錄下的初始 uwot 版本是 0.1.14,我在這個(gè)目錄下重新安裝了 uwot 的 0.1.13 版本。兩個(gè)版本沒(méi)有共存,而是將原來(lái)的 uwot 0.1.14 版本卸載掉了,安裝上了 uwot 的 0.1.13 版本。這就是我們?yōu)槭裁匆獦?gòu)造新的 libpath 的原因 —— 同一個(gè) libpath 下的包只有1個(gè)版本。


實(shí)現(xiàn)方式
R 包的安裝目錄是使用 lib 參數(shù)指定的,指定這個(gè)參數(shù)可以將 R 包下載到對(duì)應(yīng)的目錄。在指定目錄下安裝好R包后,通過(guò) .libPaths() 函數(shù)將該目錄配置為新增的 libpath。
通過(guò)在 Console 中執(zhí)行 .libPaths() 函數(shù)配置好的 libpath 僅在當(dāng)前 rsession 中生效,“Start New Session” 之后,配置的 libpath 就會(huì)失效。
為了讓 .libPaths() 配置的 libpath 永久生效,可以將相關(guān)的配置命令寫(xiě)入的 ~/.Rprofile 中,這樣在“Start New Session” 之后,配置的 libpath 依然有效。
實(shí)現(xiàn)方式 1: 將 R 包安裝在 rpackage 目錄并配置
# 將包安裝在指定的 libpath 示例:
# 注意:libpath 必須在系統(tǒng)中存在,如果不存在,需要新建對(duì)應(yīng)的目錄:mkdir -p /home/txb/rpackage
# 將 R 包下載在指定目錄命令示例:
remotes::install_github("jlmelville/uwot", lib="/home/txb/rpackage")
install.packages("xxx", lib="/home/txb/rpackage")
devtools::install_github("xxx/xxx", lib="/home/txb/rpackage")
BiocManager::install("xxx", lib="/home/txb/rpackage")
# 查看未添加 libpath 之前 uwot 的版本
library("uwot")
packageVersion("uwot")
# 向 R 包的 libpaths 中新增一個(gè) libpath,并將它放在第 1 個(gè)元素 (最高優(yōu)先級(jí))
.libPaths(c("/home/txb/rpackage",.libPaths()))
# 查看添加 libpath 之后 uwot 的版本
library("uwot")
packageVersion("uwot")
實(shí)現(xiàn)方式 2:使用 conda 安裝 R 包并配置 libpath
# 使用 conda 安裝指定版本的 R 包
## 創(chuàng)建 conda 環(huán)境
conda create -n r-reticulate r-uwot==0.1.11 -y
conda activate r-reticulate
# 配置 libpath
.libPaths(c("/home/txb/miniconda3/envs/r-reticulate/lib/R/library", .libPaths()))
# 查看此時(shí) R 找到的第 1 個(gè) R 包的版本。
library("uwot")
packageVersion("uwot")
效果演示
結(jié)合 rstudio-server 查看 R 包的版本。在這個(gè)步驟我先 "Start New Session" 將原先配置的 libpath 取消掉(后面會(huì)說(shuō)明原因)。
.libPaths(c("/home/txb/rpackage",.libPaths()))
library("uwot")
packageVersion("uwot")
.libPaths(c("/home/txb/miniconda3/envs/r-reticulate/lib/R/library", .libPaths()))
library("uwot")
packageVersion("uwot")
# Seurat 中會(huì) import uwot,此時(shí) uwot 無(wú)法 unload,想要切換 uwot 版本,有兩種方式。
# 1. 將 Seurat unload
# 2. “Start New Session”,然后再選中想要使用的 uwot 版本 (推薦)
library("Seurat")
detach("package:Seurat", unload = TRUE)


# 讓 libpath 永久生效,將相關(guān)命令寫(xiě)入到文件
file.edit("~/.Rprofile")
vi ~/.Rprofile