Seurat - Guided Clustering Tutorial官方文档学习及复现

由于本人没有使用过Seurat4.0,而是直接使用的最新版。所以本文都是基于Seurat5.2.0(截止2025/3/6)来进行撰写。

参考的官方教程来进行学习(上图中的 Guided tutorial-2.700 PBMCs),肯定没有官方文档那么全面,有一些细节我直接略过了,比如说一些数据处理的原理以及数据集的详细信息都没有去仔细查看,之后如果用到的话再补一补。

参考资料:

  1. 官方网站:Seurat - Guided Clustering Tutorial
  2. 官方数据集下载:pbmc3k_filtered_gene_bc_matrices.tar.gz
  3. 官方的所有教程:Analysis, visualization, and integration of Visium HD spatial datasets with Seurat • Seurat
  4. DimPlot函数官方参考文档:Dimensional reduction plot --- DimPlot • Seurat
  5. Guided tutorial-2.700 PBMCS:Analysis, visualization, and integration of Visium HD spatial datasets with Seurat • Seurat

一些镜像网站:

  1. 官方镜像:https://cloud.r-project.org/
  2. 中科大镜像:http://mirrors.ustc.edu.cn/CRAN/
  3. 清华镜像:https://mirrors.tuna.tsinghua.edu.cn/CRAN/

1 Install packages & Setup the Seurat Object

Genomics 免费提供的外周血单核细胞 (PBMC) 数据集。在 Illumina NextSeq 500 上测序了 2,700 个单细胞。(官方文档直译)

官方数据集下载:pbmc3k_filtered_gene_bc_matrices.tar.gz

bash 复制代码
install.packages("Seurat", repos = "https://cloud.r-project.org/")
install.packages("dplyr", repos = "https://cloud.r-project.org/")
install.packages("patchwork", repos = "https://cloud.r-project.org/")
bash 复制代码
library(dplyr)
library(Seurat)
library(patchwork)

# 导入数据集,下面的路径记得改为自己的
pbmc.data <- Read10X(data.dir = "F:/TestForR/pbmc3k/filtered_gene_bc_matrices/hg19")

# 初始化Seurat对象
# 过滤数据集中测到的少于200个基因的细胞和少于3个细胞覆盖的基因
pbmc <- CreateSeuratObject(counts = pbmc.data, project = "pbmc3k", min.cells = 3, min.features = 200)
pbmc

2 Standard pre-processing workflow

以下步骤包括 Seurat 中 scRNA-seq 数据的标准预处理工作流程。这些代表了基于 QC 指标的细胞选择和过滤、数据标准化和缩放以及高度可变特征的检测。

Seurat 允许您轻松探索 QC(Quality-Control,质控) 指标并根据任何用户定义的标准筛选细胞。社区常用的一些 QC 指标包括:

  • 在每个细胞中检测到的唯一基因的数量。
    • 低质量的细胞或空液滴通常具有很少的基因
    • 细胞双联体或多联体可能表现出异常高的基因计数
  • 同样,在细胞内检测到的分子总数(与独特基因密切相关)
  • 映射到线粒体基因组的 reads 百分比
    • 低质量/垂死细胞通常表现出广泛的线粒体污染
    • 我们使用该函数计算线粒体 QC 指标,该函数计算源自一组特征的计数百分比 PercentageFeatureSet()
    • 我们使用以开头的所有基因集作为一组线粒体基因 MT-
bash 复制代码
pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^MT-")

绘制小提琴图:过滤具有超过 2,500 个或少于 200 个唯一特征计数的单元格;过滤线粒体计数为 >5% 的细胞。

bash 复制代码
VlnPlot(pbmc, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3)

图像分析:

  1. nFeature_RNA:显示了每个细胞检测到的基因数量。小提琴图的形状表示基因数量的分布,中间的黑色点表示数据的密度。通常,低质量的细胞或空液滴会有较少的基因检测数,而多联体细胞(多个细胞合并在一起)可能会有异常高的基因计数。

  2. nCount_RNA:显示了每个细胞的总RNA分子数(即测序读取数)。这与检测到的基因数量密切相关。类似地,低质量或垂死的细胞可能会有较低的RNA计数,而双联体或多联体细胞可能会有异常高的RNA计数。

  3. percent.mt:显示了映射到线粒体基因组的reads百分比。线粒体污染是单细胞RNA测序中常见的问题,可能会影响数据的解释。低质量或垂死细胞通常表现出较高的线粒体reads百分比,这可能是细胞损伤或死亡的迹象。

将特征之间的关系进行可视化

bash 复制代码
plot1 <- FeatureScatter(pbmc, feature1 = "nCount_RNA", feature2 = "percent.mt")
plot2 <- FeatureScatter(pbmc, feature1 = "nCount_RNA", feature2 = "nFeature_RNA")
plot1 + plot2


图像结果分析:

  • 左图显示了总RNA分子数与线粒体reads百分比之间的关系,相关系数接近0,表明这两个指标之间没有明显的线性关系。线粒体污染的程度并不直接受到细胞总RNA分子数的影响。

  • 右图显示了总RNA分子数与检测到的基因数量之间的强正相关性,这是预期的,因为通常来说,一个细胞中的RNA分子数越多,能够检测到的基因种类也越多。

保留独特基因低于2500或高于200,线粒体计数<5%的细胞并储存到pbmc中

bash 复制代码
pbmc <- subset(pbmc, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5)

3 Normalizing the data

从数据集中删除不需要的单元格后,下一步是规范化数据。默认情况下,我们采用全局缩放归一化方法"LogNormalize",该方法通过总表达式对每个单元格的特征表达式测量值进行归一化,将其乘以比例因子(默认为 10,000),然后对结果进行对数转换。

bash 复制代码
pbmc <- NormalizeData(pbmc, normalization.method = "LogNormalize", scale.factor = 10000)

为清楚起见,在前面的代码行(以及将来的命令)中,为函数调用中的某些参数提供了默认值。但是,这不是必需的,可以通过以下方式实现相同的行为:

bash 复制代码
pbmc <- NormalizeData(pbmc)

4 Identification of highly variable features(feature selection)

bash 复制代码
# 使用FindVariableFeatures函数找出变异特征(即变异性高的基因)
# selection.method参数设置为"vst",表示使用方差稳定转换方法进行选择
# nfeatures参数设置为2000,表示选择2000个变异性最高的基因
pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000)

# 识别变异性最高的10个基因
# 首先使用VariableFeatures函数获取变异性高的基因名称,然后使用head函数选择前10个
top10 <- head(VariableFeatures(pbmc), 10)

# 绘制变异特征的图,不包括基因标签
# VariableFeaturePlot函数用于绘制变异特征图,展示每个基因的变异性
plot1 <- VariableFeaturePlot(pbmc)

# 在变异特征图上标注前10个变异性最高的基因
# LabelPoints函数用于在图上标注特定的点,points参数指定要标注的基因,repel参数设置为TRUE以避免标签重叠
plot2 <- LabelPoints(plot = plot1, points = top10, repel = TRUE)

# 将两幅图合并显示,即在变异特征图上添加基因标签
plot1 + plot2


图片结果分析:

左图展示了所有基因的平均表达量与标准化方差的关系。变量基因(红色点)通常在平均表达量较高或较低时表现出较高的方差,而其他大部分基因则显示出较低的方差。帮助识别出哪些基因具有较高的变异性。

右图展示了变量基因在 PCA 中的负载情况。这些基因在主成分中的高负载表明它们在解释数据变异性和区分不同细胞类型方面具有重要作用。例如,PPBP在 PC1 中具有高负载,表明它在区分不同的细胞亚群中起到了关键作用。帮助理解哪些基因在区分不同细胞类型方面具有重要作用。

这里有个巨变态的报错:

bash 复制代码
Error in `value[[3L]]()`:
! The RStudio Plots window may be too small to show this patchwork.
ℹ Please make the window larger.
Run `rlang::last_trace()` to see where the error occurred.
警告信息:
1: In scale_x_log10() :
  log-10 transformation introduced infinite values.
2: In scale_x_log10() :
  log-10 transformation introduced infinite values.

然后你的plot图像里面显示不出来图片,他的意思是说你的视图窗口太小了,你把plot窗口拉大就OK了,有点无语说实话。


5 Scaling the data

接下来,我们应用线性变换("缩放"),这是 PCA 等降维技术之前的必要步骤。这个步骤的主要功能包括:

  • 调整每个基因的表达值,使所有细胞的平均表达值为 0
  • 标准化每个基因的表达值,使所有细胞的方差为 1

这个步骤在后续分析中给予每个基因同等的权重,高表达基因不会占主导地位

  • 标准化后的结果存储在 pbmc[["RNA"]]$scale.data

  • 默认情况下,仅对可变特征进行缩放

  • 您也可以指定参数来缩放其他功能特征

bash 复制代码
all.genes <- rownames(pbmc)
pbmc <- ScaleData(pbmc, features = all.genes)

6 Perform linear dimensional reduction

接下来,我们对缩放数据执行 PCA(主成分分析)。默认情况下,只有先前确定的变量特征用作输入,但如果您希望选择不同的子集,则可以使用 features 参数进行定义(如果您确实想使用特征的自定义子集,请确保首先将这些变量传递给 ScaleData)。

对于第一个主成分,Seurat 输出具有最多正负载和负负载的基因列表,代表数据集中单个细胞之间表现出相关性(或反相关性)的基因模块。

bash 复制代码
pbmc <- RunPCA(pbmc, features = VariableFeatures(object = pbmc))

Seurat 提供了几种有用的方法来可视化定义 PCA 的单元格和特征,包括 VizDimReduction()DimPlot()DimHeatmap()

bash 复制代码
# 查看和可视化 PCA 结果的几种不同方式

# 打印 PCA 结果,显示前 5 个主成分及其对应的基因
# 参数 dims 指定显示的主成分范围,nfeatures 指定每个主成分显示的基因数量
print(pbmc[["pca"]], dims = 1:5, nfeatures = 5)

# 可视化主成分的基因负载,dims 参数指定要可视化的主成分,reduction 参数指定降维方法为 "pca"
VizDimLoadings(pbmc, dims = 1:2, reduction = "pca")

图片分析: 左图展示了基因在PC1上的负载情况。右图展示了基因在PC2上的负载情况。

bash 复制代码
# 绘制 PCA 降维图,并移除图例
DimPlot(pbmc, reduction = "pca") + NoLegend()
bash 复制代码
# 使用DimHeatmap函数绘制热图,专注于PCA的第一个主成分
# dims参数指定要绘制的主成分,这里设置为1,代表第一个主成分
# cells参数指定要展示的细胞数量,这里设置为500
# balanced参数设置为TRUE,表示在热图中平衡展示正负负载的基因[^3^][^4^]
DimHeatmap(pbmc, dims = 1, cells = 500, balanced = TRUE)
bash 复制代码
# 绘制前15个主成分的热图,用于展示在PCA降维中每个主成分的基因表达模式
DimHeatmap(pbmc, dims = 1:15, cells = 500, balanced = TRUE)

7 Determine the dimensionality of the dataset

在单细胞RNA测序数据分析中,使用Seurat软件进行主成分分析(PCA)来克服技术噪音,并选择合适的主成分数量。虽然可以使用JackStraw程序启发的重采样测试 ,但这种方法计算成本高且缓慢。因此,推荐使用一种启发式方法,即通过"肘部图"(Elbow Plot)来确定主成分数量,该图根据每个成分解释的方差百分比进行排名,以识别数据中主要信号所在的主成分范围。文中暗示前10个主成分可能已经捕获了大部分的真实信号。(摘自官网)

bash 复制代码
ElbowPlot(pbmc)

图中曲线的"肘部"位置,即曲线开始变得平缓的点,暗示了在这一点之前的主成分能够解释大部分的数据变异,而额外的主成分贡献较小,因此常被用作选择合适主成分数量的依据。

出于好奇,去看了一下JackStraw程序启发的重采样测试并且进行复现,非常非常慢 ,花了五分钟才走完进度条,还Elbow Plot大法好。

代码在下面了:

bash 复制代码
# 对pbmc对象执行JackStraw测试,以评估每个主成分的显著性
# num.replicate参数设置为100,表示进行100次重复抽样
pbmc <- JackStraw(pbmc, num.replicate = 100)

# 计算每个主成分的JackStraw得分,用于后续的显著性评估
# dims参数设置为1:20,表示计算前20个主成分的得分
pbmc <- ScoreJackStraw(pbmc, dims = 1:20)

# 绘制前15个主成分的JackStraw显著性图,展示每个主成分的显著性得分
JackStrawPlot(pbmc, dims = 1:15)

8 Cluster the cells

官方文档中叽里呱啦说了一堆,看得头疼,直接放弃。我直接找的其他与Seurat相关的内容看了一下,结合KIMI整理了一下归纳总结如下。

Seurat 采用了基于图形的聚类方法,其灵感来源于 Macosko 等人的初始策略。该方法使用以下步骤进行聚类分析:

  1. 距离指标:基于先前确定的主成分(PC)保持不变。
  2. 改进的聚类方法:受到最近研究的启发,这些研究将基于图的聚类方法应用于单细胞RNA测序(scRNA-seq)数据和CyTOF数据。
  3. 图形结构:将单元格嵌入到图形结构中,例如K最近邻(KNN)图,并在具有相似特征表达模式的单元格之间绘制边缘。
  4. 社区划分:尝试将图划分为高度互连的"准小圈子"或"社区"。

主要步骤

  • 构建 KNN 图 :首先根据 PCA 空间中的欧几里得距离构建 KNN 图,并根据局部邻域中的共享重叠(Jaccard 相似性)来细化边权重。使用函数FindNeighbors(),输入:前10个主成分(PC)

  • 聚类 :应用模块化优化技术(如鲁汶算法或SLM)以迭代方式将单元分组,优化标准模块化函数。包含一个 resolution 参数,控制聚类的"粒度",值增加会导致集群数量增加。推荐设置:0.4-1.2之间,适用于约3K细胞的单细胞数据集。使用函数:FindClusters()Idents()

bash 复制代码
pbmc <- FindNeighbors(pbmc, dims = 1:10)
pbmc <- FindClusters(pbmc, resolution = 0.5)

结果说明: 网络中有2638个节点,对应于单细胞数据集中的细胞数量;有95965条边,对应于细胞之间的连接数,这些连接是基于细胞间相似性计算得出的;在10次随机初始化后,获得的最大模块化值(modularity)为0.8723。模块化值是衡量网络划分质量的指标,值越高表示社区划分越好,通常值在0.3以上就被认为是一个良好的划分。算法识别出了9个社区,每个社区代表数据集中的一个细胞群,这些细胞群在基因表达模式上具有相似性。

bash 复制代码
head(Idents(pbmc), 5)

查看 pbmc 中前5个细胞的聚类标识(cluster IDs)。Idents() 函数用于获取 Seurat 对象中细胞的当前聚类标识,而 head() 函数用于显示这些标识的前5个值。输出结果显示了5个细胞的聚类标识,每个标识对应一个数字:

  • 第一个细胞(AAACATACAACCAC-1)被分配到簇2(cluster 2)。
  • 第二个细胞(AAACATTGAGCTAC-1)被分配到簇3(cluster 3)。
  • 第三个细胞(AAACATTGATCAGC-1)也被分配到簇2(cluster 2)。
  • 第四个细胞(AAACCGTGCTTCCG-1)被分配到簇1(cluster 1)。
  • 第五个细胞(AAACCGTGTATGCG-1)被分配到簇6(cluster 6)。

输出结果的最后部分(Levels: 0 1 2 3 4 5 6 7 8)显示了所有可能的聚类标识级别,从0到8。因为在这个Seurat对象中,细胞被分配到了9个不同的簇中,标识从0到8(类似数组下标?)。


9 Run non-linear dimensional reduction (UMAP/tSNE)

Seurat 提供了几种非线性降维技术,例如 t-SNE 和 UMAP,用于可视化和探索这些数据集。这些算法的目标是学习数据集中的底层结构,以便将相似的单元放在低维空间中。但所有可视化技术都有局限性,无法完全代表底层数据的复杂性。特别是,这些方法旨在保持数据集中的局部距离(即确保具有非常相似基因表达谱的细胞共定位),但通常不会保留更多的全局关系。官方鼓励 用户利用 UMAP 等技术进行可视化,但要避免仅根据可视化技术得出生物学结论。

(之前玩python的时候用过t-sne做可视化,还没用过umap,感觉应该挺有意思)。

这里我就都试了一下,左边是umap,右边是tsne。然后官网说:"Which dimensionality reduction to use. If not specified, first searches for umap, then tsne, then pca",所以我们首选umap,其次tsne,最次pca。

bash 复制代码
pbmc <- RunTSNE(pbmc, dims = 1:10) 
plot1 <- DimPlot(pbmc, reduction = "umap")
plot2 <- DimPlot(pbmc, reduction = "tsne")
plot1 + plot2

全文最重要的一步,保存pbmc对象:

bash 复制代码
# 将pbmc对象保存到指定路径,我这里用绝对路径
saveRDS(pbmc, file = "E:/Code/RCode/pbmc_tutorial.rds")

10 Finding differentially expressed features (cluster biomarkers)

Seurat能够帮助用户找到用于定义细胞簇的DE标记物。默认情况下,Seurat会识别指定簇与其他所有细胞相比的正负标记物。使用FindAllMarkers函数可以自动为所有簇执行标记物识别过程,也可以比较不同簇或单个细胞之间的差异。

在Seurat v5版本中,引入了presto软件包来显著提高DE分析的速度,特别是对于大型数据集。对于不使用presto的用户,可以通过调整FindMarkers函数中的min.pctlogfc.threshold参数来优化DE测试的速度和结果。

bash 复制代码
# 找出簇2中的所有标记物
cluster2.markers <- FindMarkers(pbmc, ident.1 = 2)
head(cluster2.markers, n = 5)
bash 复制代码
# 簇5与簇0/3之间的差异表达标志物
cluster5.markers <- FindMarkers(pbmc, ident.1 = 5, ident.2 = c(0, 3))
head(cluster5.markers, n = 5)
bash 复制代码
# 在所有剩余细胞中找到每簇的标记物,并只报道阳性位点
pbmc.markers <- FindAllMarkers(pbmc, only.pos = TRUE)
pbmc.markers %>%
    group_by(cluster) %>%
    dplyr::filter(avg_log2FC > 1)

下面这个结果是官网贴的,有七千多行,试了一下可以运行,一行就要35s左右,就不跑了...

bash 复制代码
## # A tibble: 7,046 × 7
## # Groups:   cluster [9]
##        p_val avg_log2FC pct.1 pct.2 p_val_adj cluster gene     
##        <dbl>      <dbl> <dbl> <dbl>     <dbl> <fct>   <chr>    
##  1 1.74e-109       1.19 0.897 0.593 2.39e-105 0       LDHB     
##  2 1.17e- 83       2.37 0.435 0.108 1.60e- 79 0       CCR7     
##  3 8.94e- 79       1.09 0.838 0.403 1.23e- 74 0       CD3D     
##  4 3.05e- 53       1.02 0.722 0.399 4.19e- 49 0       CD3E     
##  5 3.28e- 49       2.10 0.333 0.103 4.50e- 45 0       LEF1     
##  6 6.66e- 49       1.25 0.623 0.358 9.13e- 45 0       NOSIP    
##  7 9.31e- 44       2.02 0.328 0.11  1.28e- 39 0       PRKCQ-AS1
##  8 4.69e- 43       1.53 0.435 0.184 6.43e- 39 0       PIK3IP1  
##  9 1.47e- 39       2.70 0.195 0.04  2.01e- 35 0       FHIT     
## 10 2.44e- 33       1.94 0.262 0.087 3.34e- 29 0       MAL      
## # ℹ 7,036 more rows

但是呢,为了这个文档的完整性,我们可以根据前面的知识,来举一反三,只找前几个细胞簇的标记基因。

bash 复制代码
top_clusters <- 0:9 # 前9个
pbmc.markers <- FindAllMarkers(pbmc, idents = top_clusters, only.pos = TRUE)

Seurat 提供了多种差异表达(DE)测试方法,可以通过设置 test.use 参数来选择。test.use 参数允许你在不同的统计测试之间进行切换,以找到最适合你数据的测试方法。例如,你可以选择使用 ROC 测试,它返回任何一个标记基因的"分类能力"(范围从 0 - 随机到 1 - 完美)。

bash 复制代码
# 使用 ROC 测试找到簇 0 的标记基因
cluster0.markers <- FindMarkers(pbmc, ident.1 = 0, logfc.threshold = 0.25, test.use = "roc", only.pos = TRUE)

Seurat 还提供了多种工具来可视化标记基因的表达情况,如 VlnPlot()FeaturePlot()RidgePlot()CellScatter()DotPlot()。这些工具可以帮助你更好地理解不同基因在不同细胞簇中的表达模式。

bash 复制代码
VlnPlot(pbmc, features = c("MS4A1", "CD79A"))

MS4A1在细胞簇 2 和 6 中有较高的表达水平。在其他细胞簇中表达较低,尤其是簇 0、1、3、4、5 和 8。CD79A:在细胞簇 2 和 6 中也有较高的表达水平。在其他细胞簇中表达较低,尤其是簇 0、1、3、4、5 和 8。

MS4A1 和 CD79A 这两个基因在细胞簇 2 和 6 中高度表达,表明这些簇可能包含相似的细胞类型,例如 B 细胞。CD79A 是 B 细胞表面标志物,因此这两个簇可能主要由 B 细胞组成。

bash 复制代码
VlnPlot(pbmc, features = c("NKG7", "PF4"), slot = "counts", log = TRUE)

NKG7在细胞簇 3 和 5 中有较高的表达水平。在其他细胞簇中表达较低,尤其是簇 0、1、2、4、6 和 8。PF4在细胞簇 4 中有极高的表达水平。在其他细胞簇中表达较低,尤其是簇 0、1、2、3、5、6 和 8。

NKG7 在细胞簇 3 和 5 中高表达,表明这些簇可能包含 NK 细胞,因为 NKG7 是 NK 细胞的标志物。PF4 在细胞簇 4 中极高表达,表明这个簇可能包含血小板或巨核细胞,因为 PF4 是这些细胞的标志物。

bash 复制代码
FeaturePlot(pbmc, features = c("MS4A1", "GNLY", "CD3E", "CD14", "FCER1A", "FCGR3A", "LYZ", "PPBP",
    "CD8A"))

这些基因在 UMAP 降维图上的表达分布帮助我们理解不同细胞簇的特征。例如,MS4A1 和 CD79A 的高表达区域可能对应于 B 细胞簇,而 GNLY 和 CD3E 的高表达区域可能对应于 T 细胞簇。

bash 复制代码
pbmc.markers %>%
    group_by(cluster) %>%
    dplyr::filter(avg_log2FC > 1) %>%
    slice_head(n = 10) %>%
    ungroup() -> top10
DoHeatmap(pbmc, features = top10$gene) + NoLegend()

如果你前面没跑pbmc.markers的代码的话,这里是会报错找不到对象'pbmc.markers',跑出来下面这张巨恐怖的图:

11 Assigning cell type identity to clusters

在这个数据集的情况下,我们可以使用规范标记轻松地将无偏聚类与已知细胞类型相匹配:

Cluster ID Markers Cell Type
0 IL7R, CCR7 Naive CD4+ T
1 CD14, LYZ CD14+ Mono
2 IL7R, S100A4 Memory CD4+
3 MS4A1 B
4 CD8A CD8+ T
5 FCGR3A, MS4A7 FCGR3A+ Mono
6 GNLY, NKG7 NK
7 FCER1A, CST3 DC
8 PPBP Platelet
bash 复制代码
new.cluster.ids <- c("Naive CD4 T", "CD14+ Mono", "Memory CD4 T", "B", "CD8 T", "FCGR3A+ Mono",
    "NK", "DC", "Platelet")
names(new.cluster.ids) <- levels(pbmc)
pbmc <- RenameIdents(pbmc, new.cluster.ids)
DimPlot(pbmc, reduction = "umap", label = TRUE, pt.size = 0.5) + NoLegend()

最后,别忘了保存你的Seurat对象

bash 复制代码
saveRDS(pbmc, file = "E:/Code/RCode/pbmc_final.rds")

12 个人学习过程中遇到的一些问题

12.1 install package失败问题

如果你直接安装的话他会和你说什么镜像问题,所以直接用镜像安装就OK了,很简单的问题。

bash 复制代码
install.packages("spatstat.utils", repos = "https://cloud.r-project.org/")

12.2 library(Seurat)导包问题

报错如下:

bash 复制代码
> library(Seurat)
载入需要的程序包:SeuratObject
载入需要的程序包:sp
载入程序包:'SeuratObject'
The following objects are masked from 'package:base':

    intersect, t

错误: package or namespace load failed for 'Seurat' in loadNamespace(i, c(lib.loc, .libPaths()), versionCheck = vI[[i]]):
 不存在叫'spatstat.utils'这个名称的程序包

这里其实很蠢,就是RStudio需要自己手动勾选你需要的package,但是我一直在从代码里面去导包,这里一直没有打钩,在这里卡了快二十多分钟吧。。。记录一下,然后可能会出现你其实已经Install某个包了,但是一直给你报错,就是因为你没打钩。。。。。。。

相关推荐
云上艺旅3 小时前
K8S学习之基础十八:k8s的灰度发布和金丝雀部署
学习·云原生·容器·kubernetes
明矾java4 小时前
MySQL进阶-关联查询优化
数据库·mysql
冰糖码奇朵4 小时前
大数据表高效导入导出解决方案,mysql数据库LOAD DATA命令和INTO OUTFILE命令详解
java·数据库·sql·mysql
迷路的小犀牛4 小时前
【MYSQL数据库异常处理】执行SQL语句报超时异常
数据库·sql·mysql
极限实验室6 小时前
INFINI Labs 产品更新 | Easysearch 增加异步搜索等新特性
数据库
m0_748246876 小时前
maven导入spring框架
数据库·spring·maven
前后相随6 小时前
springboot集成maven多模块开发
数据库·oracle
勘察加熊人7 小时前
fastapi房产销售系统
数据库·lua·fastapi
Alan-Xia7 小时前
使用jest测试用例之入门篇
前端·javascript·学习·测试用例
三天不学习7 小时前
uniapp x 学习之 uts 语言快速入门
学习·uni-app