Enrichment Analysis
Christina Schmidt
Heidelberg UniversityMacabe Daley
Heidelberg University, DKFZSource:
vignettes/EnrichmentAnalysis.Rmd
EnrichmentAnalysis.Rmd
In this tutorial we showcase how
to use MetaProViz:
- To access metabolite prior knowledge.
- To deal with many-to-many mapping in your metabolite
identifiers.
- To perform pathway enrichment analysis.
First if you have not done yet, install the required dependencies and
load the libraries:
# 1. Install Rtools if you haven’t done this yet, using the appropriate version (e.g.windows or macOS).
# 2. Install the latest development version from GitHub using devtools
#devtools::install_github("https://github.com/saezlab/MetaProViz")
library(MetaProViz)
#dependencies that need to be loaded:
library(magrittr)
library(dplyr)
#Please install the Biocmanager Dependencies:
#BiocManager::install("clusterProfiler")
#BiocManager::install("EnhancedVolcano")
#BiocManager::install("cosmosR")
1. Loading the example data
As part of the
MetaProViz package you can load the example data into
your global environment using the function
toy_data()
:1.
Cell line experiment (CellLine)
Here we choose an example datasets, which is publicly available on metabolomics
workbench project PR001418 including metabolic profiles of human
renal epithelial cells HK2 and cell renal cell carcinoma (ccRCC) cell
lines cultured in Plasmax cell culture media (Sciacovelli et al. 2022). The raw data are
available via metabolomics
workbench study ST002224 were intracellular metabolomics of HK2 and
ccRCC cell lines 786-O, 786-M1A and 786-M2A were performed.
We have performed pre-processing and differential analysis (details can
be found in the vignette vignette Standard
Metabolomics) and and here we load the differential metabolite
analysis results for the comparison of 786M-1A versus HK2.
#Load the Pre-processed intracellular data:
Intra_DMA_786M1A_vs_HK2<- MetaProViz::ToyData(Data="IntraCells_DMA")
2.
Tissue experiment (Tissue)
Here we chose publicly available data from the paper
“An Integrated Metabolic Atlas of Clear Cell Renal Cell Carcinoma”,
which includes metabolomic profiling on 138 matched clear cell renal
cell carcinoma (ccRCC)/normal tissue pairs.
We have performed differential analysis (details can be found in the
vignette Metadata
Analysis) and and here we load the differential metabolite analysis
results for the comparison of Tumour versus Normal.
# Load the example data:
Tissue_TvsN <- MetaProViz::ToyData(Data="Tissue_DMA")
Tissue_TvsN_Old <- MetaProViz::ToyData(Data="Tissue_DMA_Old")
Tissue_TvsN_Young <- MetaProViz::ToyData(Data="Tissue_DMA_Young")
2. Accessing Prior Knowledge
Metabolite prior knowledge (PK) is essential for the interpretation of
metabolomics data. It can be used to perform pathway enrichment
analysis, compound class enrichment analysis, and by using specific PK
databases, it can be used to study the connection of metabolites and
receptors or transporters.Since the quality and content of the PK will
dictate the success of the downstream analysis and biological
interpretation, it is important to ensure the PK is used
correctly.
Specifically in metabolite PK, the many different PK databases and
resources pose several issues. Indeed, the metabolite identifiers
(e.g. KEGG, HMDB, PubChem, etc.) are not standardized across databases,
and the same metabolite can have multiple identifiers in different
databases. This is known as the many-to-many mapping problem.
Moreover, metabolic pathways that are the basis of the PK databases also
includes co-factors such as ions or other small molecules that are not
only part of most reactions, but can also not be detected in
experimentallly acquired data (e.g. H2O, CO2, etc).
KEGG pathway-metabolite sets
KEGG pathways that are loaded via KEGG API using the package
KEGGREST
and can be used to perform pathway analysis (Kanehisa and Goto 2000).
(KEGG_Pathways)
#This will use KEGGREST to query the KEGG API to load the pathways:
MetaProViz::LoadKEGG()
#> Cached file loaded from: ~/.cache/KEGG_Metabolite.rds
term | Metabolite | MetaboliteID | Description | |
---|---|---|---|---|
1 | Glycolysis / Gluconeogenesis - Homo sapiens (human) | Pyruvate | C00022 | Glycolysis / Gluconeogenesis - Homo sapiens (human) |
2 | Glycolysis / Gluconeogenesis - Homo sapiens (human) | Acetyl-CoA | C00024 | Glycolysis / Gluconeogenesis - Homo sapiens (human) |
3 | Glycolysis / Gluconeogenesis - Homo sapiens (human) | D-Glucose | C00031 | Glycolysis / Gluconeogenesis - Homo sapiens (human) |
52 | Pentose phosphate pathway - Homo sapiens (human) | Pyruvate | C00022 | Pentose phosphate pathway - Homo sapiens (human) |
53 | Pentose phosphate pathway - Homo sapiens (human) | D-Glucose | C00031 | Pentose phosphate pathway - Homo sapiens (human) |
54 | Pentose phosphate pathway - Homo sapiens (human) | D-Fructose 6-phosphate | C00085 | Pentose phosphate pathway - Homo sapiens (human) |
Create pathway-metabolite sets
The function Make_GeneMetabSet
can be used to translate
gene names to metabolite names by using a PK network of metabolic
reactions calls CosmosR (Dugourd et al.
2021). This function is useful if you want to perform pathway
enrichment analysis on available gene-sets such as the Hallmarks
gene-sets from MSigDB (Castanza et al.
2022). Moreover, it enables you to perform combined pathway
enrichment analysis on metabolite-gene sets, if you have other data
types such as proteomics measuring the enzymes expression.
The Hallmarks gene-set is available in the package
MetaProViz
and can be loaded using the function
LoadHallmarks()
.
#Load the example data:
MetaProViz::LoadHallmarks()
term | gene |
---|---|
HALLMARK_BILE_ACID_METABOLISM | GSTK1 |
HALLMARK_BILE_ACID_METABOLISM | ABCG4 |
HALLMARK_GLYCOLYSIS | LDHC |
HALLMARK_GLYCOLYSIS | ARPP19 |
HALLMARK_GLYCOLYSIS | LDHC |
HALLMARK_GLYCOLYSIS | ARPP19 |
HALLMARK_GLYCOLYSIS | CENPA |
Now we can use the function Make_GeneMetabSet
to translate
the gene names to metabolite names.
#Translate gene names to metabolite names
Hallmarks_GeneMetab <- MetaProViz::Make_GeneMetabSet(Input_GeneSet=Hallmark_Pathways,
SettingsInfo=c(Target="gene"),
PKName="Hallmarks")
term | feature |
---|---|
HALLMARK_GLYCOLYSIS | ME2 |
HALLMARK_GLYCOLYSIS | LDHC |
HALLMARK_GLYCOLYSIS | FKBP4 |
HALLMARK_GLYCOLYSIS | HMDB0000241 |
HALLMARK_GLYCOLYSIS | HMDB0000570 |
HALLMARK_GLYCOLYSIS | HMDB0000122 |
Given that we have the gene-metabolite-sets, we can now also run
enrichment analysis on combined data types, once including the
metabolite Log2FC and one including gene Log2FC from
e.g. transcriptomics or proteomics data. Yet, it is important to keep in
mind that generally we detect less metabolites than genes and hence this
may bias the results obtained from combined enrichment analysis.
MetaLinksDB Metabolite-receptor sets
The MetaLinks database is a manually curated database of
metabolite-receptor and metabolite-transporter sets that can be used to
study the connection of metabolites and receptors or transporters (Farr et al. 2024).
MetaLinksDB_Res <- MetaProViz::LoadMetalinks()
#> Metalinks database downloaded and saved to: ~/.cache/metalinks.db
hmdb | metabolite | pubchem | metabolite_subclass | uniprot | gene_symbol | protein_type | source | db_score | experiment_score | combined_score | mor | type | transport_direction | mode_of_regulation |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
HMDB0002111 | Water | 962 | NA | A0A087X1C5 | CYP2D7 | NA | rhea | NA | NA | NA | 1 | Production-Degradation | NA | Activating |
HMDB0001377 | Oxygen | 977 | Other non-metal oxides | A0A087X1C5 | CYP2D7 | NA | rhea | NA | NA | NA | -1 | Production-Degradation | NA | Inhibiting |
HMDB0001377 | Oxygen | 977 | Other non-metal oxides | A0A1W2PPD8 | KDM4F | NA | rhea | NA | NA | NA | -1 | Production-Degradation | NA | Inhibiting |
HMDB0001967 | Carbon dioxide | 280 | Other non-metal oxides | A0A1W2PPD8 | KDM4F | NA | rhea | NA | NA | NA | 1 | Production-Degradation | NA | Activating |
HMDB0002111 | Water | 962 | NA | A0A1W2PQ27 | SSU72L1 | NA | rhea | NA | NA | NA | -1 | Production-Degradation | NA | Inhibiting |
HMDB0002111 | Water | 962 | NA | A0A1W2PQ64 | SSU72L5 | NA | rhea | NA | NA | NA | -1 | Production-Degradation | NA | Inhibiting |
HMDB0002111 | Water | 962 | NA | A0A1W2PQC6 | SSU72L4 | NA | rhea | NA | NA | NA | -1 | Production-Degradation | NA | Inhibiting |
HMDB0002111 | Water | 962 | NA | A0A1W2PQD8 | SSU72L2 | NA | rhea | NA | NA | NA | -1 | Production-Degradation | NA | Inhibiting |
hmdb | metabolite | pubchem | term_specific | term |
---|---|---|---|---|
HMDB0000660 | D-Fructose | 439709 | transporter_Production-Degradation | transporter |
HMDB0002212 | Arachidic acid | 10467 | other_protein_Production-Degradation | other_protein |
HMDB0037790 | Polyethylene glycol | 174 | catalytic_receptor_Ligand-Receptor | catalytic_receptor |
HMDB0034442 | L-trans-alpha-Amino-2-carboxycyclopropaneacetic acid | 1271 | gpcr_Ligand-Receptor | gpcr |
3. Translate IDs
Warning: Translating IDs between formats e.g. KEGG to HMDB is a non-trivial task, and it is possible for one original ID to link to many translated IDs, and vice versa. We discuss this below and in the InspectID subsection (which the TranslateID function will run by default). We currently leave it to user discretion to select the most appropriate ID based on their research question and data.
As visible from the prior knowledge tables above, it becomes clear that we require a specific metabolite ID depending on the prior knowledge resource. Indeed, the KEGG pathways include KEGG IDs, whilst the Hallmarks metabolite sets include HMDB IDs.
If we want to convert or ‘translate’ those IDs to another commonly used
form of ID, for instance because our measured data uses another type of
ID, we can make use of the MetaProViz::TranslateID()
function. This is based on OmniPathR
and RaMP DB (Braisted et al. 2023) on the
backend of our function and currently supports ID translation of
metabolites to and from the following formats:
KEGG
HMDB
ChEBI
PubChem
In the simplest case, we can use the function like so:
translated_ids_example <- TranslateID(KEGG_Pathways[39,])$Translated_DataFrame
#> [1] "Using method GetAll"
#> [1] "Converting from kegg to pubchem"
#> [1] "Converting from kegg to chebi"
#> [1] "Converting from kegg to hmdb"
MetaboliteID | term | Metabolite | Description | pubchem_collapsed | chebi_collapsed | hmdb_collapsed |
---|---|---|---|---|---|---|
C00091 | Citrate cycle (TCA cycle) - Homo sapiens (human) | Succinyl-CoA | Citrate cycle (TCA cycle) - Homo sapiens (human) | 92133 | 15380 | HMDB0001022, HMDB01022 |
Using the default translation settings for a single ID, we can see that
we receive back a single PubChem ID and ChEBI ID. However the HMDB
column has two HMDBs associated with it (HMDB0001022, HMDB01022). In
this case this difference is trivial and due to HMDB formatting
conventions: the longer version appears to be from the original HMDB ID
format versus the shorter more concise version. To avoid this we could
change the settings to remove HMDB completely, like so:
translated_ids_example <- TranslateID(KEGG_Pathways[39,],
SettingsInfo = list(IdColumn="MetaboliteID",
FromFormat=c("kegg"),
ToFormat=c("pubchem","chebi"),
Method="GetAll",
GroupingVariable="term"))$Translated_DataFrame
#> [1] "Using method GetAll"
#> [1] "Converting from kegg to pubchem"
#> [1] "Converting from kegg to chebi"
MetaboliteID | term | Metabolite | Description | pubchem_collapsed | chebi_collapsed |
---|---|---|---|---|---|
C00091 | Citrate cycle (TCA cycle) - Homo sapiens (human) | Succinyl-CoA | Citrate cycle (TCA cycle) - Homo sapiens (human) | 92133 | 15380 |
Or we could keep just the first item of every translation by changing the `Method=‘GetFirst’` parameter like so:
translated_ids_example <- TranslateID(KEGG_Pathways[39,],
SettingsInfo = list(IdColumn="MetaboliteID",
FromFormat=c("kegg"),
ToFormat=c("pubchem","chebi", "hmdb"),
Method="GetFirst",
GroupingVariable="term"))$Translated_DataFrame
#> [1] "Using method GetFirst"
#> [1] "Converting from kegg to pubchem"
#> WARNING: Only the first translated ID from <pubchem> will be returned for each unique ID from <kegg>.
#> [1] "Converting from kegg to chebi"
#> WARNING: Only the first translated ID from <chebi> will be returned for each unique ID from <kegg>.
#> [1] "Converting from kegg to hmdb"
#> WARNING: Only the first translated ID from <hmdb> will be returned for each unique ID from <kegg>.
MetaboliteID | term | Metabolite | Description | pubchem_first | chebi_first | hmdb_first |
---|---|---|---|---|---|---|
C00091 | Citrate cycle (TCA cycle) - Homo sapiens (human) | Succinyl-CoA | Citrate cycle (TCA cycle) - Homo sapiens (human) | 92133 | 15380 | HMDB0001022 |
Ideally we would want a smarter and more consistent way to filter these out. However, it is important to note that this translation process is rarely as straightforward as the one-to-one translation above (at least for PubChem and ChEBI IDs in the example).
Very commonly, an ID from one format will have a genuine one-to-many relationship with the other format (e.g. one KEGG ID maps to multiple HMDB IDs). Occasionally, it could also be a many-to-many relationship, where some of the IDs from the new format link back to multiple IDs in the original format (e.g. two different KEGG IDs map to multiple HMDS IDs, some of which are shared between them). We can inspect instances of where this is the case in our data:
translated_ids_example <- KEGG_Pathways %>% filter(MetaboliteID == 'C00009') %>%
first() %>%
TranslateID()
#> [1] "Using method GetAll"
#> [1] "Converting from kegg to pubchem"
#> [1] "Converting from kegg to chebi"
#> [1] "Converting from kegg to hmdb"
translated_ids_example_df <- translated_ids_example$Translated_DataFrame
MetaboliteID | term | Metabolite | Description | pubchem_collapsed | chebi_collapsed | hmdb_collapsed |
---|---|---|---|---|---|---|
C00009 | Oxidative phosphorylation - Homo sapiens (human) | Orthophosphate | Oxidative phosphorylation - Homo sapiens (human) | 1004, 1061, 3681305, 1003 | 26078, 18367, 43474, 39745 | HMDB0001429, HMDB0000973, HMDB0002105, HMDB0002142, HMDB0005947, HMDB00973, HMDB01429, HMDB02105, HMDB02142, HMDB05947 |
The above example of the Orthophosphate metabolite
(KEGG ID C00009
) shows the complexity of this one-to-many
multi-mapping issue: for the single KEGG ID, it returns:
4 different PubChem IDs
4 different ChEBI IDs
10 different HMDB IDs
For pathway analysis we would want to keep only one metabolite for each pathway. But we would probably want to keep our metabolite choice across pathways, avoid ambiguous mapping as much as possible (many-to-many mapping), and have this metabolite ID selection guided by any IDs we might have available to us in our input data.
This brings us to more formally discuss some of the important caveats with the standard TranslateID function, which we will discuss now in the InspectID subsection.
Inspect IDs
Some of the complexities of Translating IDs which we have discussed in the examples so far, can be demonstrated here (Fig.2). The InspectID function (which is included by default when running TranslateID) provides users with a summary of the relationships between the Original and Translated IDs.
As indicated by Figure 2, relationships between Original IDs (e.g. KEGG) and Translated IDs (e.g. HMDB), can be quite complex, resulting in One-to-None/One/Many mappings. Furthermore, the relationships between the Translated IDs (e.g. HMDB) and Original IDs (e.g. KEGG) must also be considered, because the Translated IDs could also ambiguously map back to multiple different Original IDs.
Because of these complexities we leave it to the user to decide which IDs exactly they wish to keep, which could also be influenced by which identifiers they have in their experimental results. However we automatically provide summary information to the user, with the following two tables per Translated ID type:
Mapping_Orig2Trans_XXX_to_YYY (e.g. Mapping_Orig2Trans_kegg_to_pubchem)
Mapping_Trans2Orig_YYY_to_XXX (e.g. Mapping_Trans2Orig_pubchem_to_kegg)
Each table provides the summary of either the Original ID to
Translated IDs or vice versa, with counts of the number of Pathways the
ID was present in, and most importantly the number of
Original/Translated IDs that were mapped to the left-hand-side ID. This
is then summarised in the Relationship
column, which is
specified as either:
One-to-None
: no matches were found for the ID.One-to-One
: a direct one-to-one relationship was established between either Original ID to Translated ID, or Translated ID to Original ID. Note however that this does not imply that the reverse relationship is true. See Figure 2.One-to-Many
: multiple matches were found for the ID. i.e. it is ambiguously mapped.
These tables are automatically returned as a DataFrame List when running TranslateID, and can be accessed accordingly. Note that for the full translation between all 4 ID types, it should take about 1 minute to execute.
translated_ids_example_full <- KEGG_Pathways %>% TranslateID()
#> [1] "Using method GetAll"
#> [1] "Converting from kegg to pubchem"
#> [1] "Converting from kegg to chebi"
#> [1] "Converting from kegg to hmdb"
print(names(translated_ids_example_full))
#> [1] "Translated_DataFrame" "Mapping_Orig2Trans_kegg_to_pubchem"
#> [3] "Mapping_Trans2Orig_pubchem_to_kegg" "Mapping_Orig2Trans_kegg_to_chebi"
#> [5] "Mapping_Trans2Orig_chebi_to_kegg" "Mapping_Orig2Trans_kegg_to_hmdb"
#> [7] "Mapping_Trans2Orig_hmdb_to_kegg" "TranslationSummary"
Finally, this information is summarised in the TranslationSummary table.
translated_ids_example_full$TranslationSummary
#> # A tibble: 6 × 4
#> Table `One-to-None` `One-to-One` `One-to-Many`
#> <chr> <int> <int> <int>
#> 1 Mapping_Orig2Trans_kegg_to_pubchem 1684 1300 557
#> 2 Mapping_Trans2Orig_pubchem_to_kegg 0 2929 153
#> 3 Mapping_Orig2Trans_kegg_to_chebi 1672 948 921
#> 4 Mapping_Trans2Orig_chebi_to_kegg 0 3046 112
#> 5 Mapping_Orig2Trans_kegg_to_hmdb 1691 97 1753
#> 6 Mapping_Trans2Orig_hmdb_to_kegg 0 5692 308
Table | One-to-None | One-to-One | One-to-Many |
---|---|---|---|
Mapping_Orig2Trans_kegg_to_pubchem | 1684 | 1300 | 557 |
Mapping_Trans2Orig_pubchem_to_kegg | 0 | 2929 | 153 |
Mapping_Orig2Trans_kegg_to_chebi | 1672 | 948 | 921 |
Mapping_Trans2Orig_chebi_to_kegg | 0 | 3046 | 112 |
Mapping_Orig2Trans_kegg_to_hmdb | 1691 | 97 | 1753 |
Mapping_Trans2Orig_hmdb_to_kegg | 0 | 5692 | 308 |
Note that ordinarily, we should expect that the Trans2Orig tables do not have any One-to-None relationships, because those IDs that have been already translated naturally have an Original ID that was their source.
4. Run enrichment analysis
There are two options:
1. Over Representation Analysis (ORA) that determines if a set of
features (=metabolic pathways) are over-represented in the selection of
features (=metabolites) from the data in comparison to all measured
features (metabolites) using the Fishers exact test
MetaProViz::ClusterORA
. This can be applied to clusters of
metabolites as for example the results from
MetaProViz::MCA_2Cond()
or MetaProViz::CoRe()
function. If you want to have more details on these clustering methods
please visit the vignette Standard
Metabolomics or CoRe
Metabolomics.
2. Enrichment analysis on standard differential analysis results. We
offer ORA MetaProViz::StandardORA
, but there are many other
statistical tests that can be used for enrichment analysis. The full
scope of different methods is beyond the scope of MetaProViz, but are
available in decoupleR (Badia-I-Mompel et al.
2022) packages from our group.
Session information
#> ─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────
#> setting value
#> version R version 4.4.2 (2024-10-31)
#> os Ubuntu 22.04.5 LTS
#> system x86_64, linux-gnu
#> ui X11
#> language en
#> collate C.UTF-8
#> ctype C.UTF-8
#> tz UTC
#> date 2024-11-04
#> pandoc 3.1.11 @ /opt/hostedtoolcache/pandoc/3.1.11/x64/ (via rmarkdown)
#>
#> ─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────
#> package * version date (UTC) lib source
#> abind 1.4-8 2024-09-12 [1] RSPM
#> backports 1.5.0 2024-05-23 [1] RSPM
#> beeswarm 0.4.0 2021-06-01 [1] RSPM
#> bit 4.5.0 2024-09-20 [1] RSPM
#> bit64 4.5.2 2024-09-22 [1] RSPM
#> blob 1.2.4 2023-03-17 [1] RSPM
#> broom 1.0.7 2024-09-26 [1] RSPM
#> bslib 0.8.0 2024-07-29 [1] RSPM
#> cachem 1.1.0 2024-05-16 [1] RSPM
#> car 3.1-3 2024-09-27 [1] RSPM
#> carData 3.0-5 2022-01-06 [1] RSPM
#> cellranger 1.1.0 2016-07-27 [1] RSPM
#> checkmate 2.3.2 2024-07-29 [1] RSPM
#> cli 3.6.3 2024-06-21 [1] RSPM
#> colorspace 2.1-1 2024-07-26 [1] RSPM
#> crayon 1.5.3 2024-06-20 [1] RSPM
#> curl 5.2.3 2024-09-20 [1] RSPM
#> DBI 1.2.3 2024-06-02 [1] RSPM
#> desc 1.4.3 2023-12-10 [1] RSPM
#> digest 0.6.37 2024-08-19 [1] RSPM
#> dplyr * 1.1.4 2023-11-17 [1] RSPM
#> evaluate 1.0.1 2024-10-10 [1] RSPM
#> fansi 1.0.6 2023-12-08 [1] RSPM
#> fastmap 1.2.0 2024-05-15 [1] RSPM
#> forcats * 1.0.0 2023-01-29 [1] RSPM
#> Formula 1.2-5 2023-02-24 [1] RSPM
#> fs 1.6.5 2024-10-30 [1] RSPM
#> generics 0.1.3 2022-07-05 [1] RSPM
#> ggbeeswarm 0.7.2 2023-04-29 [1] RSPM
#> ggplot2 * 3.5.1 2024-04-23 [1] RSPM
#> ggpubr 0.6.0 2023-02-10 [1] RSPM
#> ggsignif 0.6.4 2022-10-13 [1] RSPM
#> glue 1.8.0 2024-09-30 [1] RSPM
#> gtable 0.3.6 2024-10-25 [1] RSPM
#> highr 0.11 2024-05-26 [1] RSPM
#> hms 1.1.3 2023-03-21 [1] RSPM
#> htmltools 0.5.8.1 2024-04-04 [1] RSPM
#> htmlwidgets 1.6.4 2023-12-06 [1] RSPM
#> httr 1.4.7 2023-08-15 [1] RSPM
#> igraph 2.1.1 2024-10-19 [1] RSPM
#> jquerylib 0.1.4 2021-04-26 [1] RSPM
#> jsonlite 1.8.9 2024-09-20 [1] RSPM
#> kableExtra 1.4.0 2024-01-24 [1] RSPM
#> knitr 1.48 2024-07-07 [1] RSPM
#> later 1.3.2 2023-12-06 [1] RSPM
#> lifecycle 1.0.4 2023-11-07 [1] RSPM
#> logger 0.4.0 2024-10-22 [1] RSPM
#> lubridate * 1.9.3 2023-09-27 [1] RSPM
#> magrittr * 2.0.3 2022-03-30 [1] RSPM
#> memoise 2.0.1 2021-11-26 [1] RSPM
#> MetaProViz * 2.1.2 2024-11-04 [1] local
#> munsell 0.5.1 2024-04-01 [1] RSPM
#> OmnipathR 3.13.28 2024-11-04 [1] Github (saezlab/OmnipathR@4007299)
#> pillar 1.9.0 2023-03-22 [1] RSPM
#> pkgconfig 2.0.3 2019-09-22 [1] RSPM
#> pkgdown 2.1.1 2024-09-17 [1] RSPM
#> prettyunits 1.2.0 2023-09-24 [1] RSPM
#> progress 1.2.3 2023-12-06 [1] RSPM
#> purrr * 1.0.2 2023-08-10 [1] RSPM
#> R.methodsS3 1.8.2 2022-06-13 [1] RSPM
#> R.oo 1.27.0 2024-11-01 [1] RSPM
#> R.utils 2.12.3 2023-11-18 [1] RSPM
#> R6 2.5.1 2021-08-19 [1] RSPM
#> ragg 1.3.3 2024-09-11 [1] RSPM
#> rappdirs 0.3.3 2021-01-31 [1] RSPM
#> Rcpp 1.0.13-1 2024-11-02 [1] RSPM
#> readr * 2.1.5 2024-01-10 [1] RSPM
#> readxl 1.4.3 2023-07-06 [1] RSPM
#> rlang 1.1.4 2024-06-04 [1] RSPM
#> rmarkdown 2.28 2024-08-17 [1] RSPM
#> RSQLite 2.3.7 2024-05-27 [1] RSPM
#> rstatix 0.7.2 2023-02-01 [1] RSPM
#> rstudioapi 0.17.1 2024-10-22 [1] RSPM
#> rvest 1.0.4 2024-02-12 [1] RSPM
#> sass 0.4.9 2024-03-15 [1] RSPM
#> scales 1.3.0 2023-11-28 [1] RSPM
#> selectr 0.4-2 2019-11-20 [1] RSPM
#> sessioninfo 1.2.2 2021-12-06 [1] any (@1.2.2)
#> stringi 1.8.4 2024-05-06 [1] RSPM
#> stringr * 1.5.1 2023-11-14 [1] RSPM
#> svglite 2.1.3 2023-12-08 [1] RSPM
#> systemfonts 1.1.0 2024-05-15 [1] RSPM
#> textshaping 0.4.0 2024-05-24 [1] RSPM
#> tibble * 3.2.1 2023-03-20 [1] RSPM
#> tidyr * 1.3.1 2024-01-24 [1] RSPM
#> tidyselect 1.2.1 2024-03-11 [1] RSPM
#> tidyverse * 2.0.0 2023-02-22 [1] RSPM (R 4.4.0)
#> timechange 0.3.0 2024-01-18 [1] RSPM
#> tzdb 0.4.0 2023-05-12 [1] RSPM
#> utf8 1.2.4 2023-10-22 [1] RSPM
#> vctrs 0.6.5 2023-12-01 [1] RSPM
#> vipor 0.4.7 2023-12-18 [1] RSPM
#> viridisLite 0.4.2 2023-05-02 [1] RSPM
#> vroom 1.6.5 2023-12-05 [1] RSPM
#> withr 3.0.2 2024-10-28 [1] RSPM
#> xfun 0.49 2024-10-31 [1] RSPM
#> XML 3.99-0.17 2024-06-25 [1] RSPM
#> xml2 1.3.6 2023-12-04 [1] RSPM
#> yaml 2.3.10 2024-07-26 [1] RSPM
#> zip 2.3.1 2024-01-27 [1] RSPM
#>
#> [1] /home/runner/work/_temp/Library
#> [2] /opt/R/4.4.2/lib/R/site-library
#> [3] /opt/R/4.4.2/lib/R/library
#>
#> ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────