在 rstudio-server 中使用 R 包的不同版本

在 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)
請(qǐng)?zhí)砑訄D片描述

請(qǐng)?zhí)砑訄D片描述
# 讓 libpath 永久生效,將相關(guān)命令寫(xiě)入到文件
file.edit("~/.Rprofile")

vi ~/.Rprofile
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容