Intuitively visualizing and interpreting data from high-throughput genomic technologies continues to be challenging. “Genomic Visualizations in R” (GenVisR) attempts to alleviate this burden by providing highly customizable publication-quality graphics supporting multiple species and focused primarily on a cohort level (i.e., multiple samples/patients). GenVisR attempts to maintain a high degree of flexibility while leveraging the abilities of ggplot2 and bioconductor to achieve this goal.
Read the published Bioinformatics paper!
For the majority of users we recommend installing GenVisR from the release branch of Bioconductor, Installation instructions using this method can be found on the GenVisR landing page on Bioconductor.
Please note that GenVisR imports a few packages that have “system requirements”, in most cases these requirements will already be installed. If they are not please follow the instructions to install these packages given in the R terminal. Briefly these packages are: “libcurl4-openssl-dev” and “libxml2-dev”
Development for GenVisR occurs on the griffith lab github repository available here. For users wishing to contribute to development we recommend cloning the GenVisR repo there and submitting a pull request. Please note that development occurs on the R version that will be available at each Bioconductor release cycle. This ensures that GenVisR will be stable for each Bioconductor release but it may necessitate developers download R-devel.
We also encourage users to report bugs and suggest enhancements to GenVisR on the github issue page available here:
waterfall
provides a method of visualizing the
mutational landscape of a cohort. The input to waterfall
consists of a data frame derived from either a .maf (version 2.4) file
or a file in MGI annotation format (obtained from The Genome Modeling System)
specified via the fileType
parameter.
waterfall
will display the mutation occurrence and type in
the main panel while showing the mutation burden and the percentage of
samples with a mutation in the top and side sub-plots. Conflicts arising
from multiple mutations in the same gene/sample cell are resolved by a
hierarchical removal of mutations keeping the most deleterious as
defined by the order of the “mutation type” legend. Briefly this
hierarchy is as follows with the most deleterious defined first:
MAF | MGI |
---|---|
Nonsense_Mutation | nonsense |
Frame_Shift_Ins | frame_shift_del |
Frame_Shift_Del | frame_shift_ins |
Translation_Start_Site | splice_site_del |
Splice_Site | splice_site_ins |
Nonstop_Mutation | splice_site |
In_Frame_Ins | nonstop |
In_Frame_Del | in_frame_del |
Missense_Mutation | in_frame_ins |
5’Flank | missense |
3’Flank | splice_region_del |
5’UTR | splice_region_ins |
3’UTR | splice_region |
RNA | 5_prime_flanking_region |
Intron | 3_prime_flanking_region |
IGR | 3_prime_untranslated_region |
Silent | 5_prime_untranslated_region |
Targeted_Region | rna |
intronic | |
silent |
Occasionally a situation may arise in which it may be desireable to
run waterfall
on an unsupported file type. This can be
achieved by setting the fileType
parameter to “Custom”.
Further the hieararchy of mutations (described above) must be specified
with the variant_class_order
parameter which expects a
character vector describing the mutations observed in order of most to
least important. Note that all mutations in the input data must be
specified in the variant_class_order
parameter. Using this
option will require the data frame to contain the following column
names: “sample”, “gene”, “variant_class”.
To view the general behavior of waterfall
we use the
brcaMAF
data structure available within GenVisR. This data
structure is a truncated MAF file consisting of 50 samples from the TCGA
project corresponding to Breast
invasive carcinoma (complete
data from TCGA public web portal).
This type of view is of limited use without expanding the graphic
device given the large number of genes. Often it is beneficial to reduce
the number of cells in the plot by limiting the number of genes plotted.
There are three ways to accomplish this, the
mainRecurCutoff
parameter accepts a numeric value between 0
and 1 and will remove genes from the data which do not have at least x
proportion of samples mutated. For example if it were desireable to plot
those genes with mutations in >= 6% of samples:
# Load GenVisR and set seed
library(GenVisR)
set.seed(383)
# Plot only genes with mutations in 6% or more of samples
waterfall(brcaMAF, mainRecurCutoff = 0.06)
## Error in waterfall(brcaMAF, mainRecurCutoff = 0.06): unused arguments (brcaMAF, mainRecurCutoff = 0.06)
Alternatively one can set a maximum number of genes to plot via the
maxGenes
parameter which will select the top x recurrently
mutated genes. In addition specific genes of interest can be displayed
using the plotGenes
parameter. This parameter accepts a
case insensitive character vector of genes present in the data and will
subset the data on those genes. For example, if it was desirable to plot
only the following genes “PIK3CA”, “TP53”, “USH2A”, “MLL3”, AND
“BRCA1”:
# Plot only the specified genes
waterfall(brcaMAF, plotGenes = c("PIK3CA", "TP53", "USH2A", "MLL3", "BRCA1"))
## Error in waterfall(brcaMAF, plotGenes = c("PIK3CA", "TP53", "USH2A", "MLL3", : unused arguments (brcaMAF, plotGenes = c("PIK3CA", "TP53", "USH2A", "MLL3", "BRCA1"))
It is important to note that the mutation burden sub plot does not
change during these subsets, this is calculated directly from the input
via the formula: mutations in sample/coverage space * 1000000.
The coverage space defaults to the size in base pairs of the “SeqCap EZ
Human Exome Library v2.0”. This default can be changed via the parameter
coverageSpace
. This calculation is only meant to be a rough
estimate as actual coverage space can vary from sample to sample, for a
more accurate calculation the user has the option to supply an optional
argument via the parameter mutBurden
supplying the users
own calculation of mutation burden for each sample. This should be a
data frame with column names ‘sample’, ‘mut_burden’ taking the following
form:
sample | mut_burden |
---|---|
TCGA-A1-A0SO-01A-22D-A099-09 | 1.5572403530013 |
TCGA-A2-A0EU-01A-22W-A071-09 | 2.19577768355127 |
TCGA-A2-A0ER-01A-21W-A050-09 | 1.89335842847617 |
TCGA-A2-A0EN-01A-13D-A099-09 | 2.67976843443599 |
TCGA-A1-A0SI-01A-11D-A142-09 | 1.64223789887094 |
TCGA-A2-A0D0-01A-11W-A019-09 | 2.9426074728573 |
TCGA-A2-A0D0-01A-11W-A019-09 | 1.49832578136762 |
TCGA-A1-A0SI-01A-11D-A142-09 | 1.55903682620951 |
TCGA-A2-A0CT-01A-31W-A071-09 | 2.61283158874499 |
TCGA-A2-A04U-01A-11D-A10Y-09 | 1.49772855192887 |
In addition to specifying the mutation burden the user also has the
ability to plot additional clinical data. The clinical data supplied
should be a data frame in “long” format with column names “sample”,
“variable”, “value”. It is recommended to use the melt
function in the package reshape2
to coerce data into this format. Here we add clinical data to be plotted
and specify a custom order and colours for these variables putting these
values in two columns within the clinical plot legend:
# Create clinical data
subtype <- c("lumA", "lumB", "her2", "basal", "normal")
subtype <- sample(subtype, 50, replace = TRUE)
age <- c("20-30", "31-50", "51-60", "61+")
age <- sample(age, 50, replace = TRUE)
sample <- as.character(unique(brcaMAF$Tumor_Sample_Barcode))
clinical <- as.data.frame(cbind(sample, subtype, age))
# Melt the clinical data into 'long' format.
library(reshape2)
clinical <- melt(clinical, id.vars = c("sample"))
# Run waterfall
waterfall(brcaMAF, clinDat = clinical, clinVarCol = c(lumA = "blue4", lumB = "deepskyblue",
her2 = "hotpink2", basal = "firebrick2", normal = "green4", `20-30` = "#ddd1e7",
`31-50` = "#bba3d0", `51-60` = "#9975b9", `61+` = "#7647a2"), plotGenes = c("PIK3CA",
"TP53", "USH2A", "MLL3", "BRCA1"), clinLegCol = 2, clinVarOrder = c("lumA", "lumB",
"her2", "basal", "normal", "20-30", "31-50", "51-60", "61+"))
## Error in waterfall(brcaMAF, clinDat = clinical, clinVarCol = c(lumA = "blue4", : unused arguments (brcaMAF, clinDat = clinical, clinVarCol = c(lumA = "blue4", lumB = "deepskyblue", her2 = "hotpink2", basal = "firebrick2", normal = "green4", `20-30` = "#ddd1e7", `31-50` = "#bba3d0", `51-60` = "#9975b9", `61+` = "#7647a2"), plotGenes = c("PIK3CA", "TP53", "USH2A", "MLL3", "BRCA1"), clinLegCol = 2, clinVarOrder = c("lumA", "lumB", "her2", "basal", "normal", "20-30", "31-50", "51-60", "61+"))
Occasionally there may be samples not represented within the .maf
file (due to a lack of mutations). It may still be desirable to plot
these samples. To accomplish this simply add the relevant samples into
the appropriate column before loading the data and leave the rest of the
columns as NA. Alternatively the user can specify a list of samples to
plot via the plotSamples
parameter which will accept
samples not in the input data.
genCov
provides a methodology for viewing coverage
information in relation to a gene track. It takes a named list of data
frames with each data frame containing column names “end” and “cov” and
rows corresponding to coordinates within the region of interest.
Additional required arguments are a GRanges object specifying the region
of interest, a BSgenome for gc content calculation, and a TxDb object
containing transcription metadata (see the package Granges
for more information). genCov
will plot a genomic features
track and align coverage data in the list to the plot. It is recommended
to use bedtools
multicov to obtain coverage information for a region of interest. We
demonstrate genCov
functionality using pseudo-data
containing coverage information for the gene PTEN.
# Load transcript meta data
library(TxDb.Hsapiens.UCSC.hg19.knownGene)
txdb <- TxDb.Hsapiens.UCSC.hg19.knownGene
# Load BSgenome
library(BSgenome.Hsapiens.UCSC.hg19)
genome <- BSgenome.Hsapiens.UCSC.hg19
# Define a region of interest
gr <- GRanges(seqnames = c("chr10"), ranges = IRanges(start = c(89622195), end = c(89729532)),
strand = strand(c("+")))
# Create Data for input
start <- c(89622194:89729524)
end <- c(89622195:89729525)
chr <- 10
cov <- c(rnorm(1e+05, mean = 40), rnorm(7331, mean = 10))
cov_input_A <- as.data.frame(cbind(chr, start, end, cov))
start <- c(89622194:89729524)
end <- c(89622195:89729525)
chr <- 10
cov <- c(rnorm(50000, mean = 40), rnorm(7331, mean = 10), rnorm(50000, mean = 40))
cov_input_B <- as.data.frame(cbind(chr, start, end, cov))
# Define the data as a list
data <- list(`Sample A` = cov_input_A, `Sample B` = cov_input_B)
# Call genCov
genCov(data, txdb, gr, genome, gene_labelTranscriptSize = 2, transform = NULL, base = NULL)
Often it may be usefull to compress genomic space, genCov will
perform such a compression via a log transform for each feature
type,‘Intron’,‘CDS’,‘UTR’ specified by the parameter
transform
. The degree of compression can be set via the
parameter base
which will perform the appropriate log
compression for the features specified in transform
. This
behavior will occur by default, to turn off compression set the
transform
and base
parameters to NULL. Here we
display genCov
compression functionality with log-10
compression for intronic space, and log-2 compression for CDS and UTR
regions. Further we choose to display a simplified representation of
genomic features within the region of interest via the
reduce
parameter which will merge all genomic features
within a region of interest into a single transcript.
TvTi
provides a framework for visualizing transversions
and transitions for a given cohort. Input consists of a .maf (version
2.4) file containing sample and allele information (see .maf spec).
Alternatively the fileType
parameter can be set to “MGI”
with the input supplied consisting of a data frame with column names
“sample”, “reference”, and “variant”. Files for the “MGI” format can be
obtained via the Genome Modeling
System. TvTi will remove indels and multinucleotide calls from the
input and plot the proportion of Transition/Transversion types for each
sample specified in the input file.
TvTi
will also plot the observed frequency of each
Transition/Transversion type in lieu of proportion if the
type
parameter is set to “Frequency”. Here we plot the
observed frequency from brcaMAF
and change the default
colors of the plot. When modifying the color palette via the
palette
parameter specify a character vector of length 6
containing a new color for each Transition/Transversion type.
# Plot the frequency with a different color pallete
TvTi(brcaMAF, type = "Frequency", palette = c("#77C55D", "#A461B4", "#C1524B", "#93B5BB",
"#4F433F", "#BFA753"), lab_txtAngle = 75, fileType = "MAF")
If there are prior expectations about the transition/transversion
rate the user can specify that information via the parameter
y
which takes a named vector with names corresponding to
each transition/transversion type. The vector must be of length 6 with
names “A->C or T->G (TV)”, “A->G or T->C (TI)”, “A->T or
T->A (TV)”, “G->A or C->T (TI)”, “G->C or C->G (TV)”, and
“G->T or C->A (TV)”. The Resulting plot will contain an additional
subplot corresponding to the apriori expectations.
# Create a named vector of apriori expectations
expec <- c(`A->C or T->G (TV)` = 0.066, `A->G or T->C (TI)` = 0.217, `A->T or T->A (TV)` = 0.065,
`G->A or C->T (TI)` = 0.4945, `G->C or C->G (TV)` = 0.0645, `G->T or C->A (TV)` = 0.093)
# Call TvTi with the additional data
TvTi(brcaMAF, y = expec, lab_txtAngle = 45, fileType = "MAF")
cnSpec produces a plot displaying copy number segments at a cohort level. Basic input consists of a data frame with column names ‘chromosome’, ‘start’, ‘end’ ‘segmean’ and ‘sample’ with rows denoting segments with copy number alterations. A UCSC genome is also required (defaults to ‘hg19’) to determine chromosomal boundaries. cnSpec will produce a grid faceted on chromosome and sample displaying all CN segment calls in the input. Here we use the attached data set LucCNseg containing copy number segment calls for 4 samples from whole genome sequencing data.
## genome specified is preloaded, retrieving data...
By default a few select genomes are included as part of GenVisR,
these are “hg38”, “hg19”, “mm10”, “mm9”, “rn5”. If input into
genome
is not one of the previously mentioned genomes
cnSpec will attempt to query the UCSC sql database to obtain chromosomal
boundary information. This has been built in as a convenience, if
internet connectivity is an issue, or if copy number segment calls are
derived from an assembly not supported by UCSC the user can specify
chromosomal boundaries via the argument y
. This should take
the form of a data frame with column names “chromosome”, “start”, “end”
with rows providing positions for each chromosome. An example of this is
provided in the included data set hg19chr.
cnView provides a method for visualizing raw copy number calls
focused on either a single chromosome or all chromosomes. Unlike the
majority of plots within GenVisR cnView is intended to be used for a
single sample. Input consists of a data frame with column names
“chromosome”, “coordinate”, “cn”, and “p_value” (optional) as well as a
specification of which chromosome to plot specified via the parameter
chr
and which genome assembly should be used for chromosome
boundaries genome
. The algorithm will produce an ideogram
on the top track and plot copy number calls beneath. If a “p_value”
column is present in the input data cnView will create a transparency
value for all calls/observations based on that column with less
significant calls having a higher transparency. Eliminating the
“p_value” column will terminate this behavior. Here we demonstrate
cnView
pseudo-data for chromosome 14.
# Create data
chromosome <- "chr14"
coordinate <- sort(sample(0:106455000, size = 2000, replace = FALSE))
cn <- c(rnorm(300, mean = 3, sd = 0.2), rnorm(700, mean = 2, sd = 0.2), rnorm(1000,
mean = 3, sd = 0.2))
data <- as.data.frame(cbind(chromosome, coordinate, cn))
# Call cnView with basic input
cnView(data, chr = "chr14", genome = "hg19", ideogram_txtSize = 4)
NULL
cnView
obtains ideogram information and chromosomal
boundaries either via a preloaded genome or the UCSC sql database if it
is available. In the interest of flexibility the user also has the
option of specifying cytogenetic information to the argument
y
. This input should take the form of a data frame with
column names “chrom”, “chromStart”, “chromEnd”, “name”, “gieStain”. This
format mirrors what is retrievable via the aforementioned MySQL
database.
If it is desired, cnView
has the ability to overlay
segment calls on the plot. This is achieved by providing a data frame
with column names: “chromosome”, “start”, “end”, and “segmean” to the
argument z
. We demonstrate this functionality via
pseudo-data.
# create copy number data
chromosome <- "chr14"
coordinate <- sort(sample(0:106455000, size = 2000, replace = FALSE))
cn <- c(rnorm(300, mean = 3, sd = 0.2), rnorm(700, mean = 2, sd = 0.2), rnorm(1000,
mean = 3, sd = 0.2))
data <- as.data.frame(cbind(chromosome, coordinate, cn))
# create segment data
dataSeg <- data.frame(chromosome = c(14, 14, 14), start = coordinate[c(1, 301, 1001)],
end = coordinate[c(300, 1000, 2000)], segmean = c(3, 2, 3))
# call cnView with included segment data
cnView(data, z = dataSeg, chr = "chr14", genome = "hg19", ideogram_txtSize = 4)
NULL
covBars
produces a plot displaying sequencing coverage
at a cohort level. Basic input consists of a matrix with columns
representing samples, rows denoting sequencing depth (i.e. reads of
depth), and elements of the matrix representing the number of bases with
x depth for x sample.
# Example input to x
x <- matrix(sample(1e+05, 500), nrow = 50, ncol = 10, dimnames = list(0:49, paste0("Sample",
1:10)))
covBars(x)
By default the viridis color scheme is used. An alternate vector of
colors can be supplied to the param colour
.
cnFreq
produces a plot displaying the proportion
(default) or frequency of copy number losses/gains at a cohort level.
Basic input consists of a data frame with rows representing CN values
segment values.
The user has the ability to plot an ideogram representative of the
chromosome of interest for a given assembly via the function
ideoView
. Basic input consists of a data frame with column
names: “chrom”, “chromStart”, “chromEnd”, “name”, “gieStain” mirroring
the format retrievable from the UCSC sql database, and a chromosome for
which to display chromsome
. Here we use the preloaded
genome hg38 in the attached data set cytoGeno.
lohSpec
obtains mean absolute LOH difference between
tumor VAF and a default normal VAF parameter set at 50 for all calls
made within a specified window length. Input data should include column
names “chromosome”, “position”, “n_vaf”, “t_vaf”, “sample”. If the
method
specified is “tile”, mean LOH difference will be
plotted for adjacent windows across the entire genome for multiple
samples. If themethod
specified is “slide”, mean LOH
difference for overlapping windows will be plotted over a
step
sized window. When gender
is NULL, LOH
calculations will be excluded from both the X and Y chromosome for all
samples. When the gender
of each sample is specified, LOH
calculations will be performed on the X chromosome, along with all
autosomes for all samples. If the user does not provide loh information
for any chromosome-sample pair, lohSpec will plot a white rectangle in
for that region in the genome.
lohView
provides a method for visualizing Loss of
Heterozygoisty focused on either a single chromosome or all chromosomes
for a single sample. Input consists of a data frame with column names
“chromosome”, “position”, “n_vaf”, “t_vaf” and “sample” as well as a
specification of which chromosome to plot specified via the parameter
chr
and which genome assembly should be used for chromosome
boundaries genome
. Input should be restricted to
“Heterozygous Germline” calls only! The algorithm will produce an
ideogram on the top track and plot normal and tumor variant allele
fraction derived from the columns “n_vaf” and “t_vaf” beneath. Here we
demonstrate lohView
on data from the HCC1395 Cell Line for
chromosome 5.
# Call lohView with basic input, make sure input contains only Germline calls
lohView(HCC1395_Germline, chr = "chr5", genome = "hg19", ideogram_txtSize = 4)
NULL
compIdent
produces a plot comparing samples based on
identity snp variant allele frequency (VAF) values. The graphic displays
VAF values at genomic locations given via the parameter
target
. If no argument is supplied to target
the algorithm will default to 24 biallelic identity snps from the hg19
genome assembly identified by “pengelly et al. Genome Med. 2013, PMID
24070238”. compIdent
expects a data frame with rows
specifying samples and columns providing sample names and bam file
locations given to parameter x
. Please note that compIdent
will not index bam files and will look for a .bai file for the
associated bam.
Here we show the behavior of compIdent
using a
predefined dataset of vaf values accessible via the debut parameter (for
debugging and display purposes only). In an ideal case we would expect
to see similar vaf values for samples from the same origin at all 24
target sites providing a usefull method for identifying sample mix ups.
Occasionally as seen here for the HCC1395 breast cancer cell line copy
number alterations can skew the results making a sample seem
unrelated.
# Read in BSgenome object (hg19)
library(BSgenome.Hsapiens.UCSC.hg19)
hg19 <- BSgenome.Hsapiens.UCSC.hg19
# Generate plot
compIdent(genome = hg19, debug = TRUE)
NULL
It is also possible to plot just a gene of interest identified by
specifying a Txdb object, GRanges object, and a BSgenome via a call to
geneViz
. The algorithm will plot genomic features for a
single gene bounded by the Granges object overlaying gc content
calculations over those features obtained from the provided BSgenome.
Note that geneViz will output the plot and additional supplemental
information used in the plot generation as a list, to call the plot call
the first element of the list.
# need transcript data for reference
txdb <- TxDb.Hsapiens.UCSC.hg19.knownGene
# need a biostrings object for reference
genome <- BSgenome.Hsapiens.UCSC.hg19
# need Granges object
gr <- GRanges(seqnames = c("chr10"), ranges = IRanges(start = c(89622195), end = c(89729532)),
strand = strand(c("+")))
# Plot and call the graphic
p1 <- geneViz(txdb, gr, genome)
p1[[1]]
Due to the complex nature and variability of the graphics produced by GenVisR it is recommended that the user adjust the graphics device size for all outputs manually. If not given enough space within the graphics device grob objects will start to collide This can be done via the following:
pdf(file = "plot.pdf", height = 8, width = 14)
# Call a GenVisR function
waterfall(brcaMAF)
dev.off()
For the majority of plots there is a layer parameter, this allows the user to specify an additional ggplot2 layer. Using this parameter one could perform a variety of tasks including modifying the theme to control label text size, adding titles to plots, etc. Here we suppress all x-axis labels:
## R version 4.4.2 (2024-10-31)
## Platform: x86_64-pc-linux-gnu
## Running under: Ubuntu 24.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.26.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=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_TELEPHONE=C
## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
##
## time zone: Etc/UTC
## tzcode source: system (glibc)
##
## attached base packages:
## [1] stats4 stats graphics grDevices utils datasets methods
## [8] base
##
## other attached packages:
## [1] BSgenome.Hsapiens.UCSC.hg19_1.4.3
## [2] BSgenome_1.75.0
## [3] rtracklayer_1.67.0
## [4] BiocIO_1.17.1
## [5] Biostrings_2.75.3
## [6] XVector_0.47.0
## [7] TxDb.Hsapiens.UCSC.hg19.knownGene_3.2.2
## [8] GenomicFeatures_1.59.1
## [9] AnnotationDbi_1.69.0
## [10] Biobase_2.67.0
## [11] GenomicRanges_1.59.1
## [12] GenomeInfoDb_1.43.2
## [13] IRanges_2.41.2
## [14] S4Vectors_0.45.2
## [15] BiocGenerics_0.53.3
## [16] generics_0.1.3
## [17] reshape2_1.4.4
## [18] GenVisR_1.39.0
## [19] knitr_1.49
## [20] BiocStyle_2.35.0
##
## loaded via a namespace (and not attached):
## [1] DBI_1.2.3 bitops_1.0-9
## [3] gridExtra_2.3 httr2_1.0.7
## [5] formatR_1.14 biomaRt_2.63.0
## [7] rlang_1.1.4 magrittr_2.0.3
## [9] matrixStats_1.4.1 compiler_4.4.2
## [11] RSQLite_2.3.9 png_0.1-8
## [13] vctrs_0.6.5 stringr_1.5.1
## [15] pkgconfig_2.0.3 crayon_1.5.3
## [17] fastmap_1.2.0 dbplyr_2.5.0
## [19] labeling_0.4.3 Rsamtools_2.23.1
## [21] rmarkdown_2.29 UCSC.utils_1.3.0
## [23] bit_4.5.0.1 xfun_0.49
## [25] zlibbioc_1.52.0 cachem_1.1.0
## [27] jsonlite_1.8.9 progress_1.2.3
## [29] blob_1.2.4 DelayedArray_0.33.3
## [31] BiocParallel_1.41.0 parallel_4.4.2
## [33] prettyunits_1.2.0 R6_2.5.1
## [35] VariantAnnotation_1.53.0 bslib_0.8.0
## [37] stringi_1.8.4 jquerylib_0.1.4
## [39] Rcpp_1.0.13-1 SummarizedExperiment_1.37.0
## [41] Matrix_1.7-1 tidyselect_1.2.1
## [43] abind_1.4-8 yaml_2.3.10
## [45] viridis_0.6.5 codetools_0.2-20
## [47] curl_6.0.1 lattice_0.22-6
## [49] tibble_3.2.1 plyr_1.8.9
## [51] withr_3.0.2 KEGGREST_1.47.0
## [53] evaluate_1.0.1 BiocFileCache_2.15.0
## [55] xml2_1.3.6 pillar_1.10.0
## [57] BiocManager_1.30.25 filelock_1.0.3
## [59] MatrixGenerics_1.19.0 RCurl_1.98-1.16
## [61] hms_1.1.3 ggplot2_3.5.1
## [63] munsell_0.5.1 scales_1.3.0
## [65] gtools_3.9.5 glue_1.8.0
## [67] maketools_1.3.1 tools_4.4.2
## [69] sys_3.4.3 data.table_1.16.4
## [71] GenomicAlignments_1.43.0 buildtools_1.0.0
## [73] XML_3.99-0.17 grid_4.4.2
## [75] colorspace_2.1-1 GenomeInfoDbData_1.2.13
## [77] restfulr_0.0.15 cli_3.6.3
## [79] rappdirs_0.3.3 viridisLite_0.4.2
## [81] S4Arrays_1.7.1 dplyr_1.1.4
## [83] gtable_0.3.6 sass_0.4.9
## [85] digest_0.6.37 SparseArray_1.7.2
## [87] farver_2.1.2 rjson_0.2.23
## [89] memoise_2.0.1 htmltools_0.5.8.1
## [91] lifecycle_1.0.4 httr_1.4.7
## [93] bit64_4.5.2