积土而为山,积水而为海
SCP的完整安装分为两个部分,一个是R包安装,另一个是内部的python环境构建。
如果不需要运行一些python相关的方法则可以跳过下面的[创建SCP的python环境】步骤。
这里的全局环境是指R的默认包路径(在R中通过.Library
查看),与之相反的是后文中使用renv所创建的隔离环境。
R版本要求:
Python版本要求:
注意,实际上Python版本并不重要,因为无需手动配置python环境,使用SCP中的PrepareEnv
函数会自动下载安装所需版本的conda、python以及软件包。
if (!require("devtools", quietly = TRUE)) {
install.packages("devtools")
}
devtools::install_github("zhanghao-njmu/SCP")
用各种方式下载好R包,比如在R中可以运行命令:
download.file("https://github.com/zhanghao-njmu/SCP/archive/refs/tags/v0.5.1.tar.gz", destfile = "SCP.tar.gz")
devtools::install_local
自动安装SCP及相关依赖(这种安装过程可以自动寻找安装依赖包):devtools::install_local("SCP-0.5.1.tar.gz")
install.packages
安装SCP(如果缺失依赖包会报错,需要再根据提示手动逐一安装依赖包):install.packages("SCP-0.5.1.tar.gz", repos = NULL, type = "source")
当SCP首次安装好之后,运行library(SCP)
会有下面的提示:
library(SCP)
## > SCP python environment not found.
## > If you have already created an SCP python environment using conda, you can specify the conda path by setting options(reticulate.conda_binary = "/path/to/conda", SCP_env_name = "SCP_env") before loading the package.
这不是报错,你可以继续使用SCP的大部分功能,也可以运行SCP::PrepareEnv()
来继续构建SCP所需的python环境和软件包,来运行RunPAGA
、RunSCVELO
等python方法。
国内用户建议使用镜像,可用的一些镜像地址可在GitHub上找到,一般可以直接运行下面的代码完成创建:
SCP::PrepareEnv(
miniconda_repo = "https://mirrors.bfsu.edu.cn/anaconda/miniconda",
pip_options = "-i https://pypi.tuna.tsinghua.edu.cn/simple"
)
当想重装python环境时,PrepareEnv
还可以通过设置下面的两个参数之一来进行安装:
force = TRUE
表示强制安装,也就是会删除已存在的python环境和软件包conda = NULL
会重新下载安装miniconda,此时也会删除已存在的python环境并重装PrepareEnv
函数的过程大致是:
options(reticulate.conda_binary = "/path/to/conda")
如果找不到会根据miniconda_repo
自动下载miniconda,安装到miniconda到以下路径:
~/.local/share/r-miniconda
~/Library/r-miniconda
C:/Users/xxx/AppData/Local/r-miniconda
SCP_env
,用户也可以手动设置环境名称:options(SCP_env_name = "new_name")
如果找不到环境则自动创建,创建环境时使用的python版本默认为3.8(conda自动下载)
SCP会牵扯许多依赖包,如果不想干扰当前的环境,比如一些依赖包的版本不想在安装时被改变,或者想将SCP及其依赖包设定在一个固定版本避免更新,来保证重复性,我们可以使用renv。类似于conda环境,R也可以使用renv创建一个独立的R包环境。
if (!require("renv", quietly = TRUE)) {
install.packages("renv")
}
dir.create("~/SCP_env", recursive = TRUE) ## It cannot be the home directory "~" !
renv::init(project = "~/SCP_env", bare = TRUE, restart = TRUE)
renv::activate(project = "~/SCP_env")
renv::install("BiocManager")
renv::install("zhanghao-njmu/SCP", repos = BiocManager::repositories())
SCP::PrepareEnv(
miniconda_repo = "https://mirrors.bfsu.edu.cn/anaconda/miniconda",
pip_options = "-i https://pypi.tuna.tsinghua.edu.cn/simple"
)
renv::activate(project = "~/SCP_env")
renv::hydrate("SCP")
SCP::PrepareEnv(
miniconda_repo = "https://mirrors.bfsu.edu.cn/anaconda/miniconda",
pip_options = "-i https://pypi.tuna.tsinghua.edu.cn/simple"
)
renv::activate(project = "~/SCP_env")
library(SCP)
data("pancreas_sub")
pancreas_sub <- RunPAGA(srt = pancreas_sub, group_by = "SubCellType", linear_reduction = "PCA", nonlinear_reduction = "UMAP")
CellDimPlot(pancreas_sub, group.by = "SubCellType", reduction = "draw_graph_fr")
renv::snapshot(project = "~/SCP_env")
## The versions of some packages have been modified.
renv::restore(project = "~/SCP_env")
关于隔离环境的详细使用说明,请参考renv的文档:https://rstudio.github.io/renv/articles/renv.html
这是因为安装依赖于一些Bioconductor的包,但是找不到可以该包所在的仓库。
解决办法是在R中运行:
if (!require("BiocManager", quietly = TRUE)) {
install.packages("BiocManager", lib = lib)
}
options(repos = BiocManager::repositories())
之后再安装SCP或依赖包。
下载连接超时,在R中设置”options(timeout=10000)“或者手动下载安装包进行安装,参考上文[R包安装]
简单来说,就是”当前的R session中已经载入了一个旧的包,需要将其升级”。
一般情况下按照提示install.packages('xxx')
就可以了,但是很多人可能发现问题依然会出现。
也会有很多人发现一些蹊跷的地方,比如:
实际上,这个问题常出现在Rstudio中。在Rstudio打开一个新的session,按几个回车没那么快反应出命令提示符>
的话,那应该是你的rstudio正在帮你载入一些包,其中就会包括这些当事”包”。
所以一步到位的解决办法就是:打开R console(而非Rstudio)–> install.packages(‘xxx’) –> 再次安装SCP或者你所需要的包
如果想在Rstudio中避免启动session后就载入一些包,可以取消Rstudio所有的启动后加载功能:打开Tools –> Global Options –> General,将下图的选项框全部取消勾选:
问题和之前的namespace 'xxx' xxx is already loaded, but >= xxx is required.
是类似的,R session启动时被预先加载了一些包,导致无法正常加载dbplyr
。
有两种解决办法:
.Rprofile
(它是R的启动文件,会在R环境启动时自动加载),将library(dbplyr)
或者直接将library(SCP)
写入其中即可。conda的版本与处理器架构不符,需要x86_64而当前安装的是arm64,解决办法是重新下载安装miniconda/anaconda,或者在R中使用以下命令重装miniconda:
SCP::PrepareEnv(
conda = NULL,
miniconda_repo = "https://mirrors.bfsu.edu.cn/anaconda/miniconda",
pip_options = "-i https://pypi.tuna.tsinghua.edu.cn/simple",
force = TRUE
)
这是因为一个R session下通过reticulate对python的调用是单次的。
如果此前已经运行library(reticulate)
调用了一个python,且该python不是SCP所用的python(版本不符合或当中没有SCP的python环境),则需要重新启动一个新的R session再运行library(SCP)
。