1简介

根据设计,此包的范围仅限于定义SingleCellExperiment类和一些最小的getter和setter方法。基于这个原因,我们将为类提供更高级的方法的工作留给了专门包的开发bob电竞体育官网人员SingleCellExperiment类。例如,定义了许多特定的方法,例如正常化而且dplyr例如动词。我们还让现有包的开发人员提供从他们的类到的强制方bob电竞体育官网法SingleCellExperiment

使用SingleCellExperiment对象内部包函数的使用基本与实例的使用相同SummarizedExperiment类。类的内部字段的直接访问是唯一的例外SingleCellExperiment定义。在其他包中操作这些内部字段是可能的,但需要一些谨慎,我们将在下面讨论。

2使用内部字段

2.1基本原理

我们使用内部存储机制来保护spike-in和size factor字段不受用户的直接操作。这确保了,例如,只调用sizeFactors < -可以改变尺寸因素。中保留列的子集(或列名)为“private”,也可以达到同样的效果colData ()而且rowData (),尽管这并不容易实现。

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

导出用于获取或设置内部字段的方法,以供依赖的包的开发人员使用bob电竞体育官网SingleCellExperiment.这允许依赖包存储它们自己的自定义字段,用户不能直接访问这些字段。但是,这需要注意避免包之间的冲突。

2.2包之间的冲突

令人担忧的是这一揽子计划一个而且B两者都定义了获取/设置内部字段的方法X在一个SingleCellExperiment实例。考虑下面的示例对象:

library(singlecel实验)counts <- matrix(rpois(100, lambda =10), ncol=10, nrow=10) sce <- singlecel实验(assays = list(counts = counts)) sce
##类:singlecellexper实验组## dim: 10 10 ##元数据(0):## assays(1):计数## rownames: NULL ## rowData names(0): ## colnames: NULL ## colData names(0): ## reducedDimNames(0): ## spikeNames(0):

假设我们有一个函数,它设置了一个内部场X在包一个而且B

#包A中的函数:AsetX <- Function (sce) {int_colData(sce)$X <- runif(ncol(sce)) sce} #包B中的函数:BsetX <- Function (sce) {int_colData(sce)$X <- sample(LETTERS, ncol(sce), replace=TRUE) sce}

如果同时调用这两个函数,其中一个函数将破坏另一个函数的输出。这可能导致在下游程序中产生无意义的结果。

sce2 <- AsetX(sce) int_colData(sce2)$X
## [1] 0.07134424 0.38892565 0.79026679 0.05342376 0.14996977 0.02306287 [7] 0.21001399 0.50517190 0.98693002 0.81127544
sce2 <- BsetX(sce2) int_colData(sce2)$X
##[1]“k”“k”“t”“m”“u”“r”“q”“l”“o”“s”

2.3使用“inception风格”嵌套

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

AsetX_better <- function(sce) {int_colData(sce)$A <- DataFrame(X=runif(ncol(sce))) sce} BsetX_better <- function(sce) {choice <- sample(LETTERS, ncol(sce), replace=TRUE) int_colData(sce)$B <- DataFrame(X=choice) sce} sce2 <- AsetX_better(sce) sce2 <- BsetX_better(sce2) int_colData(sce2)$A$X
## [1] 0.011776343 0.002578628 0.7353846093 0.735897400 0.138374172 0.179159786 ## [7] 0.357363590 0.825238066 0.843630604 0.714260557
int_colData (sce2) B X美元
" u " " v " " g " " w " " y " " l " " k " " x " " r " " o "

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

AsetY_better <- function(sce) {int_elementMetadata(sce)$A <- DataFrame(Y=runif(nrow(sce))) sce} BsetY_better <- function(sce) {choice <- sample(LETTERS, nrow(sce), replace=TRUE) int_elementMetadata(sce)$B <- DataFrame(Y=choice) sce} sce2 <- AsetY_better(sce) sce2 <- BsetY_better(sce2) int_elementMetadata(sce2)$A$Y
[1] 0.2404742 0.4388798 0.9044977 0.1576630 0.2282000 0.7174878 0.8480277 ## [8] 0.7624563 0.6005679 0.1978965
int_elementMetadata (sce2) B美元Y
##[1]“q”“q”“k”“d”“h”“z”“r”“i”“x”“a”

对于对象范围的元数据,一个嵌套列表通常就足够了。

AsetZ_better <- function(sce) {int_metadata(sce)$A <- list(Z = "Aaron") sce} BsetZ_better <- function(sce) {int_metadata(sce)$B <- list(Z = "Davide") sce} sce2 <- AsetZ_better(sce) sce2 <- BsetZ_better(sce2) int_metadata(sce2)$A$Z
##[1]“Aaron”
int_metadata (sce2) B Z美元
“Davide”

以这种方式,两者皆有一个而且B可以设置他们的内部XY而且Z互不干扰。当然,这种策略假定包与某些内置内部字段的名称不相同(这将是非常不幸的)。

3.联系我们

类的内部字段SingleCellExperiment同学们,我们建议您与我们取得联系GitHub.这将有助于我们计划对类的内部组织进行更改。它也将允许我们与您联系有关的变化或获得反馈。

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

4其他设计决策

4.1发生什么事了reducedDims?

我们使用SimpleList随着reducedDims槽允许多重降维结果。可以想象,不同的降维技术将对分析的不同方面有用,例如,用于可视化的t-SNE,用于伪时间推断的PCA。我们看到reducedDims作为一个类似的槽分析()在这种方法中,可以存储多个矩阵,尽管降维结果不需要具有相同的维数。

4.2为什么要从RangedSummarizedExperiment?

我们决定延长RangedSummarizedExperiment而不是SummarizedExperiment因为对某些化验来说,这是必要的rowRanges ().即使是RNA-seq,有时也很有用rowRanges ()以及其他定义基因组坐标的类,例如,DESeqDataSetDESeq2包中。另一种选择是开设两门课,SingleCellExperiment而且RangedSingleCellExperiment.然而,这似乎是一个不必要的重复,因为有一个默认为空的类rowRanges当一个人不需要的时候,似乎已经足够好了rowRanges

5会话信息

sessionInfo ()
## R版本3.6.0(2019-04-26)##平台:x86_64-pc-linux-gnu(64位)##运行在Ubuntu 18.04.2 LTS下## ##矩阵产品:默认## BLAS: /home/biocbuild/bbs-3.9-bioc/R/lib/libRblas。/home/biocbuild/bbs-3.9-bioc/R/lib/libRlapack。所以## ## locale: ## [1] LC_CTYPE=en_US。UTF-8 LC_NUMERIC= c# # [3] LC_TIME=en_US。UTF-8 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 lc_phone = c# # [11] LC_MEASUREMENT=en_US。UTF-8 LC_IDENTIFICATION=C ## ##附加的基本包:##[1]并行stats4统计图形grDevices utils数据集##[8]方法基础## ##其他附加包:[1] SingleCellExperiment_1.6.0 SummarizedExperiment_1.14.0 ## [3] DelayedArray_0.10.0 BiocParallel_1.18.0 ## [5] matrixstats_0.0.54.0 Biobase_2.44.0 ## [7] GenomicRanges_1.36.0 GenomeInfoDb_1.20.0 ## [9] IRanges_2.18.0 S4Vectors_0.22.0 ## [11] BiocGenerics_0.30.0 BiocStyle_2.12.0 ## ##通过命名空间加载(并且没有附加):## [1] Rcpp_1.0.1 knitr_1.22 XVector_0.24.0 ## [4] magrittr_1.5 zlibbioc_1.30.0 lattice_0.20-38 ## [7] string_1 .4.0 tools_3.6.0 grid_3.6.0 ## [10] xfun_0.6 htmltools_0.3.6 yaml_2.2.0 ## [13] digest_0.6.18 bookdown_0.9 Matrix_1.2-17 ## [16] GenomeInfoDbData_1.2.1 BiocManager_1.30.4 bitops_1.0-6 ## [22] RCurl_1.95-4.12 evaluate_0.13 rmarkdown_1.12 ## [22] stringi_1.4.3 compiler_3.6.0