curatedCRCData: Clinically Annotated Data for the Colorectal Cancer Transcriptome

curatedCRCData: Clinically Annotated Data for the Colorectal Cancer Transcriptome

This package represents a manually curated data collection for gene expression meta-analysis of patients with colorectal cancer. This resource provides uniformly prepared microarray data with curated and documented clinical metadata. It allows a computational user to efficiently identify studies and patient subgroups of interest for analysis and to run such analyses immediately without the challenges posed by harmonizing heterogeneous microarray technologies, study designs, expression data processing methods, and clinical data formats.

In this vignette, we give a short tour of the package and will show how to use it efficiently.

Data access and caching

As of version 2.46, the datasets are no longer stored inside the package: they are hosted on Zenodo and downloaded individually the first time they are requested, then cached locally with BiocFileCache so later uses need no network access. The cache lives in a package-specific directory, tools::R_user_dir("curatedCRCData", "cache"); to reclaim disk space, delete that directory or manage it with BiocFileCache.

The legacy data(TCGA.COAD_eset) syntax still works (it downloads through the same cache) but is deprecated and will be removed in a future release; please use the curatedCRCData() function shown below.

Throughout this vignette we set test = TRUE (and test.mode <- TRUE), which loads small offline subsets of each dataset that are bundled with the package, so that the vignette builds without downloading data. For real analyses, omit these settings to work with the full datasets.

Load data sets

Loading a single dataset is very easy. First we load the package:

library(curatedCRCData)

To get a listing of all the datasets, call curatedCRCData() with no arguments:

curatedCRCData()
##  [1] "GSE11237_eset"           "GSE12225.GPL3676_eset"  
##  [3] "GSE12945_eset"           "GSE13067_eset"          
##  [5] "GSE13294_eset"           "GSE14095_eset"          
##  [7] "GSE14333_eset"           "GSE16125.GPL5175_eset"  
##  [9] "GSE17536_eset"           "GSE17537_eset"          
## [11] "GSE17538.GPL570_eset"    "GSE18105_eset"          
## [13] "GSE2109_eset"            "GSE21510_eset"          
## [15] "GSE21815_eset"           "GSE24549.GPL5175_eset"  
## [17] "GSE24550.GPL5175_eset"   "GSE2630_eset"           
## [19] "GSE26682.GPL570_eset"    "GSE26682.GPL96_eset"    
## [21] "GSE26906_eset"           "GSE27544_eset"          
## [23] "GSE28702_eset"           "GSE3294_eset"           
## [25] "GSE33113_eset"           "GSE39582_eset"          
## [27] "GSE3964_eset"            "GSE4045_eset"           
## [29] "GSE4526_eset"            "GSE45270_eset"          
## [31] "TCGA.COAD_eset"          "TCGA.READ_eset"         
## [33] "TCGA.RNASeqV2_eset"      "TCGA.RNASeqV2.READ_eset"

Now to load a single dataset (drop test = TRUE to download the full dataset):

TCGA.COAD_eset <- curatedCRCData("TCGA.COAD_eset", test = TRUE)
TCGA.COAD_eset
## ExpressionSet (storageMode: lockedEnvironment)
## assayData: 202 features, 100 samples 
##   element names: exprs 
## protocolData: none
## phenoData
##   sampleNames: TCGA.AA.3520 TCGA.AA.3532 ... TCGA.AA.3984 (100 total)
##   varLabels: unique_patient_ID alt_sample_name ...
##     uncurated_author_metadata (59 total)
##   varMetadata: labelDescription
## featureData
##   featureNames: CXCL12 CXCR4 ... ACTR3 (202 total)
##   fvarLabels: probeset gene
##   fvarMetadata: labelDescription
## experimentData: use 'experimentData(object)'
##   pubMedIds: 22810696 
## Annotation: agilent-014850 whole human genome microarray 4x44k g4112f

The datasets are provided as Bioconductor ExpressionSet objects and we refer to the Bioconductor documentation for users unfamiliar with this data structure.

Load datasets based on rules

For a meta-analysis, we typically want to filter datasets and patients to get a population of patients we are interested in. We provide a short but powerful R script that does the filtering and provides the data as a list of ExpressionSet objects. One can use this script within R by first sourcing a config file which specifies the filters, like the minimum numbers of patients in each dataset. It is also possible to filter samples by annotation, for example to remove early stage and normal samples.

source(system.file("extdata",
"patientselection_all.config",package="curatedCRCData"))
test.mode <- TRUE  # use the bundled offline subsets in this vignette
ls()
## [1] "keep.common.only"     "meta.required"        "min.number.of.events"
## [4] "min.sample.size"      "quantile.cutoff"      "rescale"             
## [7] "strict.checking"      "TCGA.COAD_eset"       "test.mode"

See what the values of these variables we have loaded are. The variable names are fairly descriptive, but note that rule.1 is a character vector of length 2, where the first entry is the name of a clinical data variable, and the second entry is a Regular Expression providing a requirement for that variable. Any number of rules can be added, with increasing identifiers, e.g. rule.2, rule.3, etc.

Here strict.checking is FALSE, meaning that samples not annotated for the variables in these rules are allowed to pass the filter. If strict.checking == TRUE, samples missing this annotation will be removed.

sapply(ls(), get)
## $keep.common.only
## [1] FALSE
## 
## $meta.required
## NULL
## 
## $min.number.of.events
## [1] 0
## 
## $min.sample.size
## [1] 1
## 
## $quantile.cutoff
## [1] 0
## 
## $rescale
## [1] FALSE
## 
## $strict.checking
## [1] FALSE
## 
## $TCGA.COAD_eset
## ExpressionSet (storageMode: lockedEnvironment)
## assayData: 202 features, 100 samples 
##   element names: exprs 
## protocolData: none
## phenoData
##   sampleNames: TCGA.AA.3520 TCGA.AA.3532 ... TCGA.AA.3984 (100 total)
##   varLabels: unique_patient_ID alt_sample_name ...
##     uncurated_author_metadata (59 total)
##   varMetadata: labelDescription
## featureData
##   featureNames: CXCL12 CXCR4 ... ACTR3 (202 total)
##   fvarLabels: probeset gene
##   fvarMetadata: labelDescription
## experimentData: use 'experimentData(object)'
##   pubMedIds: 22810696 
## Annotation: agilent-014850 whole human genome microarray 4x44k g4112f 
## 
## $test.mode
## [1] TRUE

Now that we have defined the sample filter, we create a list of ExpressionSet objects by sourcing the createEsetList.R file:

source(system.file("extdata", "createEsetList.R", package = "curatedCRCData"))
## 2026-10-10 10:45:33.273226 INFO::Inside script createEsetList.R - inputArgs =
## 2026-10-10 10:45:33.277091 INFO::None provided
## 2026-10-10 10:45:33.289969 INFO::Loading curatedCRCData 2.45.6
## 2026-10-10 10:45:33.717283 INFO::Clean up the esets.
## 2026-10-10 10:45:33.781517 INFO::including GSE11237_eset
## 2026-10-10 10:45:33.78544 INFO::including GSE12225.GPL3676_eset
## 2026-10-10 10:45:33.788666 INFO::including GSE12945_eset
## 2026-10-10 10:45:33.79192 INFO::including GSE13067_eset
## 2026-10-10 10:45:33.79533 INFO::including GSE13294_eset
## 2026-10-10 10:45:33.798734 INFO::including GSE14095_eset
## 2026-10-10 10:45:33.80211 INFO::including GSE14333_eset
## 2026-10-10 10:45:33.805417 INFO::including GSE16125.GPL5175_eset
## 2026-10-10 10:45:33.808784 INFO::including GSE17536_eset
## 2026-10-10 10:45:33.812106 INFO::including GSE17537_eset
## 2026-10-10 10:45:34.207434 INFO::including GSE17538.GPL570_eset
## 2026-10-10 10:45:34.211302 INFO::including GSE18105_eset
## 2026-10-10 10:45:34.214682 INFO::including GSE2109_eset
## 2026-10-10 10:45:34.218312 INFO::including GSE21510_eset
## 2026-10-10 10:45:34.221657 INFO::including GSE21815_eset
## 2026-10-10 10:45:34.224958 INFO::including GSE24549.GPL5175_eset
## 2026-10-10 10:45:34.228774 INFO::including GSE24550.GPL5175_eset
## 2026-10-10 10:45:34.231976 INFO::including GSE2630_eset
## 2026-10-10 10:45:34.235199 INFO::including GSE26682.GPL570_eset
## 2026-10-10 10:45:34.239649 INFO::including GSE26682.GPL96_eset
## 2026-10-10 10:45:34.242964 INFO::including GSE26906_eset
## 2026-10-10 10:45:34.246434 INFO::including GSE27544_eset
## 2026-10-10 10:45:34.249647 INFO::including GSE28702_eset
## 2026-10-10 10:45:34.252785 INFO::including GSE3294_eset
## 2026-10-10 10:45:34.256385 INFO::including GSE33113_eset
## 2026-10-10 10:45:34.259807 INFO::including GSE39582_eset
## 2026-10-10 10:45:34.263033 INFO::including GSE3964_eset
## 2026-10-10 10:45:34.266426 INFO::including GSE4045_eset
## 2026-10-10 10:45:34.269633 INFO::including GSE4526_eset
## 2026-10-10 10:45:34.272794 INFO::including GSE45270_eset
## 2026-10-10 10:45:34.276226 INFO::including TCGA.COAD_eset
## 2026-10-10 10:45:34.27954 INFO::including TCGA.READ_eset
## 2026-10-10 10:45:34.282861 INFO::including TCGA.RNASeqV2_eset
## 2026-10-10 10:45:34.28622 INFO::including TCGA.RNASeqV2.READ_eset
## 2026-10-10 10:45:34.289121 INFO::Ids with missing data: GSE2630_eset, GSE3294_eset, TCGA.COAD_eset

It is also possible to run the script from the command line and then load the R data file within R:

R --vanilla "--args patientselection.config crc.eset.rda tmp.log"  < createEsetList.R 

Now we have 34 datasets with samples that passed our filter in a list of ExpressionSet objects called esets:

names(esets)
##  [1] "GSE11237_eset"           "GSE12225.GPL3676_eset"  
##  [3] "GSE12945_eset"           "GSE13067_eset"          
##  [5] "GSE13294_eset"           "GSE14095_eset"          
##  [7] "GSE14333_eset"           "GSE16125.GPL5175_eset"  
##  [9] "GSE17536_eset"           "GSE17537_eset"          
## [11] "GSE17538.GPL570_eset"    "GSE18105_eset"          
## [13] "GSE2109_eset"            "GSE21510_eset"          
## [15] "GSE21815_eset"           "GSE24549.GPL5175_eset"  
## [17] "GSE24550.GPL5175_eset"   "GSE2630_eset"           
## [19] "GSE26682.GPL570_eset"    "GSE26682.GPL96_eset"    
## [21] "GSE26906_eset"           "GSE27544_eset"          
## [23] "GSE28702_eset"           "GSE3294_eset"           
## [25] "GSE33113_eset"           "GSE39582_eset"          
## [27] "GSE3964_eset"            "GSE4045_eset"           
## [29] "GSE4526_eset"            "GSE45270_eset"          
## [31] "TCGA.COAD_eset"          "TCGA.READ_eset"         
## [33] "TCGA.RNASeqV2_eset"      "TCGA.RNASeqV2.READ_eset"

Non-unique gene symbols

In the standard version of curatedCRCData (the version available on Bioconductor), we collapse manufacturer probesets to official HGNC symbols using the Biomart database. Some probesets are mapped to multiple HGNC symbols in this database. For these probesets, we provide all the symbols. For example 220159_at maps to ABCA11P and ZNF721 and we provide ABCA11P///ZNF721 as probeset name. If you have an array of gene symbols for which you want to access the expression data, “ABCA11P” would not be found in curatedCRCData in this example. The following function will create a new ExpressionSet in which both ZNF721 and ABCA11P are features with identical expression data:

expandProbesets <- function (eset, sep = "///") 
{
    x <- lapply(featureNames(eset), function(x) strsplit(x, sep)[[1]])
    eset <- eset[order(sapply(x, length)), ]
    x <- lapply(featureNames(eset), function(x) strsplit(x, sep)[[1]])
    idx <- unlist(sapply(1:length(x), function(i) rep(i, length(x[[i]]))))
    xx <- !duplicated(unlist(x))
    idx <- idx[xx]
    x <- unlist(x)[xx]
    eset <- eset[idx, ]
    featureNames(eset) <- x
    eset
}

X <- TCGA.COAD_eset[head(grep("AA", featureNames(TCGA.COAD_eset))),]
exprs(X)[,1:3]
##         TCGA.AA.3520 TCGA.AA.3532 TCGA.AA.3553
## AAAS        -0.72125     -1.51150     -1.01250
## AACS         0.02225      0.82375     -0.08500
## AADAC        0.02775     -0.42900      1.12525
## AADACL1      1.06600      1.85550      0.92800
## AADACL2      0.08750     -0.61825     -0.47525
## AADACL3      0.38100      0.31100      0.33950
exprs(expandProbesets(X))[,1:3]
##         TCGA.AA.3520 TCGA.AA.3532 TCGA.AA.3553
## AAAS        -0.72125     -1.51150     -1.01250
## AACS         0.02225      0.82375     -0.08500
## AADAC        0.02775     -0.42900      1.12525
## AADACL1      1.06600      1.85550      0.92800
## AADACL2      0.08750     -0.61825     -0.47525
## AADACL3      0.38100      0.31100      0.33950

Appendix

Available Clinical Characteristics

Available clinical annotation. This heatmap visualizes for each curated clinical characteristic (rows) the availability in each dataset (columns). Red indicates that the corresponding characteristic is available for at least one sample in the dataset.

Available clinical annotation. This heatmap visualizes for each curated clinical characteristic (rows) the availability in each dataset (columns). Red indicates that the corresponding characteristic is available for at least one sample in the dataset.

Summarizing the List of ExpressionSets

This example provides a table summarizing the datasets being used, and is useful when publishing analyses based on curatedCRCData. First, define some useful functions for this purpose:

source(system.file("extdata", "summarizeEsets.R", package = "curatedCRCData"))
## Warning in min(which(km.fit$surv < 0.5)): no non-missing arguments to min;
## returning Inf
## Warning in min(which(km.fit$surv < 0.5)): no non-missing arguments to min;
## returning Inf
## Warning in min(which(reverse.km.fit$surv < 0.5)): no non-missing arguments to
## min; returning Inf
## Warning in min(which(reverse.km.fit$surv < 0.5)): no non-missing arguments to
## min; returning Inf
## Warning in min(which(reverse.km.fit$surv < 0.5)): no non-missing arguments to
## min; returning Inf

Optionally write this table to file, for example ( replace myfile <- tempfile() with something like myfile <- "nicetable.csv" )

(myfile <- tempfile())
## [1] "/tmp/Rtmp9BSVXH/file134b71016c43"
write.table(summary.table, file=myfile, row.names=FALSE, quote=TRUE, sep=",")
Datasets provided by curatedCRCData.
Study PMID N samples msi status G Platform median.survival median follow-up percent censoring binarized OS (long/short)
GSE11237 Auman, Mcleod 2008 18653328 23 0/0/23 3/16/4/0/0 Affymetrix HG_U95Av2 NA NA NA NA
GSE12225.GPL3676 Lips, Morreau 2008 18959792 42 0/0/42 0/0/0/0/42 NA NA NA NA NA
GSE12945 Staub, Rosenthal 2009 19399471 62 0/0/62 0/31/31/0/0 Affymetrix HG-U133A NA 49 81 NA
GSE13067 Jorissen and Sieber 2008 19088021 74 0/0/74 0/0/0/0/74 Affymetrix HG-U133Plus2 NA NA NA NA
GSE13294 Jorissen and Sieber 2008 19088021 100 0/0/100 0/0/0/0/100 Affymetrix HG-U133Plus2 NA NA NA NA
GSE14095 Watanabe, Hashimoto 2008 21680303 100 0/0/100 0/0/0/0/100 Affymetrix HG-U133Plus2 NA NA NA NA
GSE14333 Jorissen and Sieber 2008 19996206 100 0/0/100 0/0/0/0/100 Affymetrix HG-U133Plus2 NA NA NA NA
GSE16125.GPL5175 Reid, Pierotti 2009 19672874 36 0/0/36 0/0/0/0/36 Affymetrix HuEx-1_0-st 74 22 69 NA
GSE17536 Smith JJ,??Beauchamp RD 2009 19914252 100 0/0/100 13/79/8/0/0 Affymetrix HG-U133Plus2 133 65 73 NA
GSE17537 Smith JJ,??Beauchamp RD 2009 19914252 55 0/0/55 1/32/3/0/19 Affymetrix HG-U133Plus2 NA 57 64 NA
GSE17538.GPL570 Smith JJ,??Beauchamp RD 2009 19914252 100 0/0/100 13/79/8/0/0 Affymetrix HG-U133Plus2 133 65 73 NA
GSE18105 Matsuyama, Sugihara 2009 20162577 100 0/0/100 0/0/0/0/100 Affymetrix HG-U133Plus2 NA NA NA NA
GSE2109 expO, IGC 2005 PMID unknown 100 0/0/100 2/64/19/2/13 Affymetrix HG-U133Plus2 NA NA NA NA
GSE21510 Tsukamoto, Sugihara 2010 21270110 100 0/0/100 0/0/0/0/100 Affymetrix HG-U133Plus2 NA NA NA NA
GSE21815 Mori M,??Mimori K,??Yokobori T 2010 21862635 100 0/0/100 22/14/1/0/63 Agilent G4112F NA NA NA NA
GSE24549.GPL5175 Sveen A,????esen TH,??Rognum TO,??Lothe RA,??Skotheim RI 2011 21619627 83 0/0/83 0/0/0/0/83 Affymetrix HuEx-1_0-st NA NA NA NA
GSE24550.GPL5175 Sveen A,????esen TH,??Rognum TO,??Lothe RA,??Skotheim RI 2011 21619627 90 0/0/90 0/0/0/0/90 Affymetrix HuEx-1_0-st NA NA NA NA
GSE2630 Bandr??E,??Malumbres R,??Cubedo E,??Sola J,??Garc??Foncillas J,??Labarga A 2005 17390049 16 0/0/16 0/0/0/0/16 NA NA NA NA NA
GSE26682.GPL570 Vilar E,??Morgan MA 2011 21300766 100 0/0/100 0/0/0/0/100 Affymetrix HG-U133Plus2 NA NA NA NA
GSE26682.GPL96 Vilar E,??Morgan MA 2011 21300766 100 0/0/100 0/0/0/0/100 Affymetrix HG-U133A NA NA NA NA
GSE26906 Olschwang S 2011 22496922 90 0/0/90 0/0/0/0/90 Affymetrix HG-U133Plus2 NA NA NA NA
GSE27544 Bernal M,??Garc??Alcalde F,??Concha ????Blanco A,??Garrido F,??Ruiz-Cabello F 2011 PMID unknown 22 0/0/22 0/0/0/0/22 Affymetrix HT HG-U133+ PM NA NA NA NA
GSE28702 Tsuji 2011 22095227 83 0/0/83 62/16/5/0/0 Affymetrix HG-U133Plus2 NA NA NA NA
GSE3294 Bianchini 2005 16773188 24 0/0/24 10/11/3/0/0 UHN SS-Human 19Kv7 NA NA NA NA
GSE33113 Medema JP,??Tanis PJ 2011 22496204 96 0/0/96 0/0/0/0/96 Affymetrix HG-U133Plus2 NA NA NA NA
GSE39582 Marisa, Boige 2012 23700391 100 0/0/100 0/0/0/0/100 Affymetrix HG-U133Plus2 NA NA NA NA
GSE3964 Graudens, Imbeaud 2006 16542501 29 0/0/29 0/0/0/0/29 NA NA NA NA NA
GSE4045 Laiho, Aaltonen 2007 16819509 37 0/0/37 4/28/4/0/1 Affymetrix HG-U133A NA NA NA NA
GSE4526 Watanabe T,??Kobunai T,??Toda E,??Oka T 2006 19016304 36 0/0/36 0/0/0/0/36 Affymetrix HG-U133Plus2 NA NA NA NA
GSE45270 Medema JP,??de Sousa E Melo F,??Vermeulen L,??Jansen M,??Dekker E,??Van Noesel C,??Fessler E 2013 PMID unknown 13 0/0/13 0/0/0/0/13 Affymetrix HG-U133Plus2 NA NA NA NA
TCGA.COAD The Cancer Genome Atlas Network 2012 22810696 100 0/0/100 0/0/0/0/100 Agilent G4502A-07-3 24 25 33 NA
TCGA.READ The Cancer Genome Atlas Network 2012 22810696 51 0/0/51 0/0/0/0/51 Agilent G4502A-07-3 10 NA 0 NA
TCGA.RNASeqV2 The Cancer Genome Atlas Network 2012 22810696 100 0/0/100 0/0/0/0/100 14 NA 15 NA
TCGA.RNASeqV2.READ The Cancer Genome Atlas Network 2012 22810696 6 0/0/6 0/0/0/0/6 41 NA 0 NA

For non-R users

If you are not doing your analysis in R, and just want to get some data you have identified from the curatedCRCData manual, here is a simple way to do it. For one dataset:

library(curatedCRCData)
library(Biobase)
TCGA.COAD_eset <- curatedCRCData("TCGA.COAD_eset")
write.csv(exprs(TCGA.COAD_eset), file="TCGA.COAD_eset_exprs.csv")
write.csv(pData(TCGA.COAD_eset), file="TCGA.COAD_eset_clindata.csv")

Or for several datasets:

data.to.fetch <- curatedCRCData(c("TCGA.COAD_eset", "GSE39582_eset"))
for (onedata in names(data.to.fetch)){
    write.csv(exprs(data.to.fetch[[onedata]]),
              file=paste(onedata, "_exprs.csv", sep=""))
    write.csv(pData(data.to.fetch[[onedata]]),
              file=paste(onedata, "_clindata.csv", sep=""))
}

Session Info

## R version 4.6.1 (2026-06-24)
## Platform: x86_64-pc-linux-gnu
## Running under: Ubuntu 26.04.1 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
## LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.32.so;  LAPACK version 3.12.0
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
##  [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_TELEPHONE=C            
## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
## 
## time zone: Etc/UTC
## tzcode source: system (glibc)
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] knitr_1.52            logging_0.10-111      survival_3.8-12      
##  [4] curatedCRCData_2.45.6 Biobase_2.73.2        BiocGenerics_0.59.12 
##  [7] generics_0.1.4        xtable_1.8-8          sva_3.61.0           
## [10] BiocParallel_1.47.0   genefilter_1.95.0     mgcv_1.9-4           
## [13] nlme_3.1-171          BiocStyle_2.41.0     
## 
## loaded via a namespace (and not attached):
##  [1] KEGGREST_1.53.6       httr2_1.3.0           xfun_0.61            
##  [4] bslib_0.12.0          lattice_0.23-1        vctrs_0.7.3          
##  [7] tools_4.6.1           curl_8.0.0            stats4_4.6.1         
## [10] parallel_4.6.1        tibble_3.3.1          AnnotationDbi_1.75.2 
## [13] RSQLite_3.53.3        blob_1.3.0            pkgconfig_2.0.3      
## [16] BiocBaseUtils_1.15.1  Matrix_1.7-6          dbplyr_2.6.0         
## [19] S4Vectors_0.51.10     lifecycle_1.0.5       compiler_4.6.1       
## [22] Biostrings_2.81.9     statmod_1.5.2         Seqinfo_1.3.2        
## [25] codetools_0.2-20      htmltools_0.5.9       sys_3.4.3            
## [28] buildtools_1.0.0      sass_0.4.10           yaml_2.3.12          
## [31] pillar_1.11.1         crayon_1.5.3          jquerylib_0.1.4      
## [34] cachem_1.1.0          limma_3.99.0          tidyselect_1.2.1     
## [37] locfit_1.5-9.12       digest_0.6.39         dplyr_1.2.1          
## [40] maketools_1.3.2       splines_4.6.1         fastmap_1.2.0        
## [43] grid_4.6.1            cli_3.6.6             magrittr_2.0.5       
## [46] XML_3.99-0.25         edgeR_4.99.6          filelock_1.0.3       
## [49] bit64_4.8.6           rmarkdown_2.32        XVector_0.53.0       
## [52] httr_1.4.9            matrixStats_1.5.0     bit_4.6.0            
## [55] otel_0.2.0            png_0.1-9             memoise_2.0.1        
## [58] evaluate_1.0.5        IRanges_2.47.5        BiocFileCache_3.3.0  
## [61] rlang_1.3.0           glue_1.8.1            DBI_1.3.0            
## [64] BiocManager_1.30.27   annotate_1.91.0       jsonlite_2.0.0       
## [67] R6_2.6.1              MatrixGenerics_1.25.0