141-R小技巧-R包的多版本控制
刘小泽写于19.10.16
遇到的问题
分析单细胞数据时,需要同时检查Seurat2和Seurat3两种版本的结果差异,而且生成的文件很大(几个G的RData),因此用两台电脑分别分析再将结果放到一起的办法行不通。
常用的解决方案
第一种:一次一个版本,使用R包降级
比如我现在的版本是3.1.0,想换成2.3.4再分析
remove.packages('Seurat')
pkgs = c( 'mixtools', 'lars', 'dtw', 'doSNOW', 'hdf5r' )
BiocManager::install(pkgs,ask = F,update = F)
# 以后只需要修改这个版本号即可
packageurl <- "https://cran.r-project.org/src/contrib/Archive/Seurat/Seurat_2.3.4.tar.gz"
install.packages(packageurl, repos=NULL, type="source")
这样的优点是便于操作,对于版本切换不频繁的使用者来说,用一两次还是可以的。不过要做好切换一次再次切换回来的时间准备,另外其中的hdf5r
包安装有时会出问题
第二种:同时安装多个版本,再切换
首先新建一个安装路径
mkdir ~/R/3.6.0/library
然后将这个路径加到默认的搜索路径中
# 先看看当前有什么路径
.libPaths()
# 然后加入新路径
myPaths <- .libPaths()
new <- c('~/R/3.6.0/library')
myPaths <- c(myPaths, new)
.libPaths(myPaths)
如果说原来的路径中安装了Seurat的3.1.0版本,现在想在新的~/R/3.6.0/library
中安装一个2.3.4版本,可以先将默认搜索路径切换到新的
# 切换路径也很简单[假如目前只有两个路径,把新路径提到优先搜索的位置]
myPaths <- .libPaths()
myPaths <- c(myPaths[2], myPaths[1])
.libPaths(myPaths)
然后再新路径中安装2.3.4版本
packageurl <- "https://cran.r-project.org/src/contrib/Archive/Seurat/Seurat_2.3.4.tar.gz"
install.packages(packageurl, repos=NULL, type="source")
注意!如果之前运行过Seurat,要将原来已经加载的版本先卸载掉,然后才能加载新的版本
# 先把原来的版本移除
detach("package:Seurat", unload=TRUE)
# 再重新加载新版本[使用一个参数指定我们要加载哪个库中的包]
library(Seurat, lib.loc="~/R/3.6.0/library")
这样的好处就是:以后再安装存在多个版本的R包的时候,就可以使用detach() + library(name, lib.loc=)
的方法。不过自己就要记好哪个版本在哪个路径中
一气呵成的版本
# 原本有4个R包路径,现在再添加一个
myPaths <- .libPaths()
new <- c('~/r-2nd-pkgs')
myPaths <- c(myPaths, new)
.libPaths(myPaths)
.libPaths()
# 接下来调整位置,第一个是默认安装路径(位置随意调整)
myPaths <- .libPaths()
myPaths <- c(myPaths[5], myPaths[2],myPaths[1],myPaths[3],myPaths[4])
.libPaths(myPaths)
.libPaths()
# 接下来就能在新的路径下安装其他版本了,例如安装seurat 2.3.4,它还需要其他依赖包
pkgs = c( 'mixtools', 'lars', 'dtw', 'doSNOW', 'hdf5r','fpc','foreach' )
BiocManager::install(pkgs,ask = F,update = F)
packageurl <- "https://cran.r-project.org/src/contrib/Archive/Seurat/Seurat_2.3.4.tar.gz"
install.packages(packageurl, repos=NULL, type="source")
# 最后卸载之前的版本,加载新建版本
detach("package:Seurat", unload=TRUE)
library(Seurat, lib.loc="~/r-2nd-pkgs")
packageVersion('Seurat')