1介绍

通过设计,这个包的范围仅限于定义SingleCellExperiment类和一些最小的getter和setter方法。出于这个原因,我们留给开发人员的专业包提供更高级的方法2021欧洲杯体育投注开户SingleCellExperiment类。如果包定义自己的数据结构,这是他们的责任提供强制从他们的类/方法SingleCellExperiment

对于开发2021欧洲杯体育投注开户人员来说,使用SingleCellExperiment对象内包函数主要是一样的使用实例的基础SummarizedExperiment类。唯一的例外包括直接访问的内部字段SingleCellExperiment定义。操纵这些内部领域其他包是有可能的,但需要一些提醒,我们将在下面讨论。

2使用内部字段

2.1基本原理

我们使用一个内部存储机制来保护某些字段由用户直接操作。这将确保只提供调用setter方法可以改变大小的因素。同样的效果可以通过保留列的一个子集(或列名)作为“私人”colData ()rowData (),尽管这并不容易实现。

内部存储避免情况用户或函数可以静静地覆盖操作期间这些重要的元数据字段rowDatacolData。这会导致错误很难追踪,特别是在长工作流涉及许多功能。它还允许我们添加新方法和元数据类型SingleCellExperiment而不用担心覆盖用户提供的元数据在现有对象。

方法来获取或设置的内部字段导出供开发人员使用依赖的包2021欧洲杯体育投注开户SingleCellExperiment。这允许依赖包存储自己的自定义字段不是由用户直接访问。然而,这需要一些注意避免冲突包。

2.2包之间的冲突

问题是,包一个B这两个定义获取/设置一个内部字段的方法X在一个SingleCellExperiment实例。考虑下面的示例对象:

库(SingleCellExperiment)计数< -矩阵(rpois(100年,λ= 10),ncol = 10, nrow = 10) sce < - SingleCellExperiment(化验=列表(数量=计数))预计
# # # #类:SingleCellExperiment暗淡:10 10 # #元数据(0):# #化验(1):计数# # rownames:零构成了rowData名称(0):# # # # colnames:零# # colData名称(0):# # reducedDimNames (0): # # mainExpName:零# # altExpNames (0):

假设我们有功能,设置一个内部字段X在包一个B

#功能打包:AsetX < -函数(sce) {int_colData (sce) $ X <——runif (ncol (sce) sce} #功能包B: BsetX < -函数(sce) {int_colData (sce) $ X < -样本(信件、ncol (sce),取代= TRUE) sce}

如果这两个功能,一个将击败其他的输出。这可能导致下游过程荒谬的结果。

sce2 < - AsetX (sce) int_colData (sce2) $ X
# # [1]0.18338142 0.44127561 0.88598168 0.05015315 0.84740180 - 0.18116976 # # 0.42870153 0.45480416 0.97295330 0.47753503 [7]
sce2 < - BsetX (sce2) int_colData (sce2) $ X
# # [1]“G”“L”“A”“G”“S”“V”“Z”“G”“M”“Y”

2.3使用“Inception-style”嵌套

我们建议使用嵌套DataFrame年代存储内部字段的列级元数据。嵌套的元素的名称应该设置为包的名称,从而避免冲突从不同的包具有相同名称的字段。

AsetX_better < -函数(sce) {int_colData (sce) <——美元DataFrame (X = runif (ncol (sce))) sce} BsetX_better < -函数(sce){选择< -样本(信件、ncol (sce),取代= TRUE) int_colData (sce) $ B < - DataFrame南加州爱迪生公司(X =选择)}sce2 < - AsetX_better (sce) sce2 < - BsetX_better (sce2) int_colData (sce2) X美元美元
# # [1]0.476614274 0.004446292 0.727949636 0.298296037 0.559791869 - 0.959403064 # # 0.461845758 0.055382425 0.953069502 0.841883700 [7]
int_colData (sce2) B X美元
# # [1]“M”“”“”“Z”“Y”“V”“E”“C”“我”“K”

同样的方法可以应用于行级元数据,例如,对于一些行字段Y

AsetY_better < -函数(sce) {int_elementMetadata (sce) <——美元DataFrame (Y = runif (nrow (sce))) sce} BsetY_better < -函数(sce){选择< -样本(信件、nrow (sce),取代= TRUE) int_elementMetadata (sce) $ B < - DataFrame南加州爱迪生公司(Y =选择)}sce2 < - AsetY_better (sce) sce2 < - BsetY_better (sce2) int_elementMetadata (sce2) $ $ Y
# # [1]0.74536140 0.64278697 0.03576555 0.43239115 0.96047194 - 0.45200965 # # 0.17316490 0.64152220 0.42699161 0.05313723 [7]
int_elementMetadata (sce2) B美元Y
# # [1]“A”“L”“V”“N”“T”“W”“问”“E”" H " " O "

object-wide元数据,一个嵌套列表通常是足够的。

AsetZ_better < -函数(sce) {int_metadata (sce) $ < -列表(Z =“伦”)sce} BsetZ_better < -函数(sce) {int_metadata (sce) $ B < -列表(Z =“大卫。”)sce} sce2 < - AsetZ_better (sce) sce2 < - BsetZ_better (sce2) int_metadata (sce2) Z美元美元
# #[1]“伦”
int_metadata (sce2) B Z美元
# #[1]“大卫。”

通过这种方式,两个一个B可以设置他们的内部X,YZ没有互相干扰。当然,这个策略假设包没有相同的名称作为内置的一些内部字段(很不幸)。

3联系我们

如果你的包访问的内部字段SingleCellExperiment课堂上,我们建议你进入与我们联系GitHub。这将帮助我们在规划类的内部组织的变化。它也会让我们联系你关于变更或得到反馈。

我们特别感兴趣的场景多个包定义内部字段相同的科学意义。在这种情况下,它可能是有价值的,为这一领域提供getter和setterSingleCellExperiment直接。这减少了冗余在包的定义和促进互操作性。例如,方法从一个包可以设置字段,可以使用另一个包的方法。

4其他的设计决策

4.1是什么了reducedDims吗?

我们使用一个SimpleList随着reducedDims槽允许多重降维结果。一个可以想象不同的降维技术将用于分析的不同方面,例如,t-SNE可视化,PCA伪时间推理。我们看到reducedDims类似的槽分析()可以存储多个矩阵,但降维结果不需要相同数量的维度。

4.2为什么来自一个RangedSummarizedExperiment吗?

我们决定延长RangedSummarizedExperiment而不是SummarizedExperiment因为某些化验这将是至关重要的rowRanges ()。即使对于RNA-seq,这有时是有用的rowRanges ()和其他类定义基因组坐标,例如,DESeqDataSetDESeq2包中。另一种是有两类,SingleCellExperimentRangedSingleCellExperiment。然而,这似乎是一个不必要的重复类默认是空的rowRanges当一个人不需要看起来足够好了rowRanges

4.3为什么不使用MultiAssayExperiment吗?

存储的另一种方法是使用一个替代实验MultiAssayExperiment。我们不做绝大多数scRNA-seq数据分析操作内生基因。切换到MultiAssayExperiment介绍了一个额外的间接层在大多数情况下没有好处。事实上,这个类的方法在很大程度上是不必要的,当替代实验包含相同数据样本。通过存储嵌套的实验中,我们熟悉的维护SummarizedExperiment界面更好的兼容性和易用性。

会话信息

sessionInfo ()
# # R版本4.2.0 RC (2022-04-19 r82224) # #平台:x86_64-pc-linux-gnu(64位)# #下运行:Ubuntu 20.04.4 LTS # # # #矩阵产品:默认# #布拉斯特区:/home/biocbuild/bbs - 3.15 - bioc / R / lib / libRblas。所以# # LAPACK: /home/biocbuild/bbs - 3.15 - bioc / R / lib / libRlapack。# # # #语言环境:# # [1]LC_CTYPE = en_US。utf - 8 LC_NUMERIC = C # #[3]而= en_GB LC_COLLATE = C # # [5] LC_MONETARY = en_US。utf - 8 LC_MESSAGES = en_US。utf - 8 # # [7] LC_PAPER = en_US。utf - 8 LC_NAME = C # # [9] LC_ADDRESS C = C LC_TELEPHONE = # # [11] LC_MEASUREMENT = en_US。utf - 8 LC_IDENTIFICATION = C附加基本包:# # # # # # [1]stats4统计图形grDevices跑龙套数据集方法# # # # # #[8]基地其他附加包:# # [1]SingleCellExperiment_1.18.0 SummarizedExperiment_1.26.0 # # [3] Biobase_2.56.0 GenomicRanges_1.48.0 # # [5] GenomeInfoDb_1.32.0 IRanges_2.30.0 # # [7] S4Vectors_0.34.0 BiocGenerics_0.42.0 # # [9] MatrixGenerics_1.8.0 matrixStats_0.62.0 # # [11] BiocStyle_2.24.0 # # # #通过加载一个名称空间(而不是附加):# # [1]bslib_0.3.1 compiler_4.2.0 BiocManager_1.30.17 # # [4] jquerylib_0.1.4 XVector_0.36.0 bitops_1.0-7 # # [7] tools_4.2.0 zlibbioc_1.42.0 digest_0.6.29 # # [10] jsonlite_1.8.0 evaluate_0.15 lattice_0.20-45 # # [13] rlang_1.0.2 Matrix_1.4-1 DelayedArray_0.22.0 # # [16] cli_3.3.0 yaml_2.3.5 xfun_0.30 # # [19] fastmap_1.1.0 GenomeInfoDbData_1.2.8 stringr_1.4.0 # # [22] knitr_1.38 sass_0.4.1 grid_4.2.0 # # [25] R6_2.5.1 rmarkdown_2.14 bookdown_0.26 # # [28] magrittr_2.0.3 htmltools_0.5.2 stringi_1.7.6 # # [31] rcurl_1.98 - 1.6