114-R工具指南22-R包的版本控制

2022-04-05 15:35:18 浏览数 (2)

  • 参考:
    • 141-R小技巧-R包的多版本控制 | BIOINFOPLANET (jieandze1314.com)[1]

前言

之前我们提到过 [[09-R工具指南08-R的版本控制]],那么我们可不可以对R 包进行管理呢?

正好最近我在做单细胞的项目,其中在加载Seurat 对象时发生了报错:

代码语言:javascript复制
Error in `[[<-`(`*tmp*`, "orig.ident", value = idents) : [[<- defined for objects of type "S4" only for subclasses of environment

网上找了一圈,发现是版本的问题。

可如果我不想把原来3.2 的Seurat 覆盖,可不可以多个版本呢?

多个路径

在[[59-R工具指南17-R包安装路径的更换与设定]] 我们知道.libPath 可以获得或设置安装包的目录。

那很容易啊,我们把新版本装在A,旧版本在B不就好了:

代码语言:javascript复制
.libPaths() 
myPaths <- .libPaths() 
new <- c('/home/data/xx/R/seurat4')
myPaths <- c(new, myPaths) 
.libPaths(myPaths)

# 安在新的目录
install.packages("Seurat", lib = new)

因为new 目录,被我们提到了更靠前的位置,因此这里只需要library 就可以加载新版本啦。如果需要旧版本,指定旧版本所在的位置即可。

当然,你需要记得哪个版本在哪个目录。

ps:之前写过一个[[62-R工具指南18-用pacman管理你的R包]] 的R包,可惜它并没有R包的版本控制的功能。

如果是其他情况,比如你想一劳永逸的修改R 包的环境,而非每次都通过.libPaths() 修改。

第一个方法是直接在Rprofile 中贴一下你的代码:

代码语言:javascript复制
# file.edit(~/.Rprofile)
.libPaths() 
myPaths <- .libPaths() 
new <- c('/home/data/xx/R/seurat4')
myPaths <- c(new, myPaths) 
.libPaths(myPaths)

# 安在新的目录
install.packages("Seurat", lib = new)

而在.Renviron 设置环境变量就稍微复杂一下。网上的教程看起来有点奇怪。

而我,也发现一个有意思的内容:

代码语言:javascript复制
> Sys.getenv("R_LIBS_USER")
[1] "~/R/x86_64-conda-linux-gnu-library/4.0"
> .libPaths()
[1] "/home/data/xx/miniconda3/envs/R4.0/lib/R/library"

如果退出conda 环境:

代码语言:javascript复制
> Sys.getenv("R_LIBS_USER")
[1] "~/R/x86_64-pc-linux-gnu-library/4.0"
>  .libPaths()
[1] "/home/data/xx/R/x86_64-pc-linux-gnu-library/4.0"
[2] "/usr/local/lib/R/library"  

Sys.getenv("R_LIBS_USER") 获得的和.libPaths()获得的有什么差别呢?

另外:

代码语言:javascript复制
> .Library
[1] "/Library/Frameworks/R.framework/Resources/library"
> Sys.getenv("R_LIBS_USER")
[1] "~/Library/R/4.0/library"
> .libPaths()
[1] "/Library/Frameworks/R.framework/Versions/4.0/Resources/library"

三者各不相同。

这里先按下不表。因为我也不知道。

直接conda

你也可以直接通过conda 创建多个R 和多个R 的环境。比如区分R4.1_seurat3 和R4.1_seurat4,可以参见:[[112-R工具指南21-使用conda帮你在服务器上装R包]]

我们既可以通过conda 解决复杂包服务器安装所需的环境,也可以利用其特性天然地隔离不同项目版本所需的包,不必受复杂的版本与管理包目录而烦心。

补充一句

这里我还想额外补充一句,一般来说,我有两种风格的R 包管理。一个是上面刚提到的conda,这个我一般用在服务器上,通常服务器的硬盘空间可以让我放开手脚安装,不必考虑空间的浪费;而这样可以同时区分不同的R 包和R 版本,一举两得,非常方便。

还有一个就是我个人电脑,比如mac 中使用Rswitch 管理R 版本,而R 包我则是区分多个R 包目录,按照访问顺序如下:

  • base R 和重要R 包;
  • 数据库类型的非常占用空间的R 包;
  • 某版本R 相关的R 包,通常我是一个不更新派,所以一般就是3.1,3.6,4.0 这样的大更新我会更新,一直安装对应的R包;
  • 版本差异大的R 包文件,比如seurat4,专门创建一个文件夹存放它。

关于如何一劳永逸设置,参考上面好了,就不赘述了。

参考资料

[1]

141-R小技巧-R包的多版本控制 | BIOINFOPLANET (jieandze1314.com): https://www.jieandze1314.com/post/cnposts/141/

0 人点赞