- 参考:
- 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/