From c1f20b9dfeedb92317ca9432ec730fd40f53b438 Mon Sep 17 00:00:00 2001 From: ovrhuman <71412394+ovrhuman@users.noreply.github.com> Date: Wed, 10 Nov 2021 11:42:32 +0000 Subject: [PATCH] pkgdown --- .Rbuildignore | 3 + .Rhistory | 144 +++---- .gitignore | 1 + _pkgdown.yml | 5 + docs/404.html | 143 +++++++ docs/LICENSE-text.html | 145 +++++++ docs/LICENSE.html | 149 +++++++ docs/articles/MultiEWCE.html | 363 +++++++++++++++++ .../MultiEWCE_files/figure-html/display-1.png | Bin 0 -> 80152 bytes .../header-attrs-2.11/header-attrs.js | 12 + docs/articles/index.html | 142 +++++++ docs/authors.html | 142 +++++++ docs/bootstrap-toc.css | 60 +++ docs/bootstrap-toc.js | 159 ++++++++ docs/docsearch.css | 148 +++++++ docs/docsearch.js | 85 ++++ docs/index.html | 111 ++++++ docs/link.svg | 12 + docs/pkgdown.css | 367 ++++++++++++++++++ docs/pkgdown.js | 108 ++++++ docs/pkgdown.yml | 7 + docs/reference/RDA_assign_load.html | 172 ++++++++ docs/reference/Rplot001.png | Bin 0 -> 1011 bytes docs/reference/ewce_para.html | 218 +++++++++++ docs/reference/ewce_plot.html | 171 ++++++++ docs/reference/gen_results.html | 264 +++++++++++++ docs/reference/get_gene_list.html | 210 ++++++++++ docs/reference/get_unfinished_list_names.html | 177 +++++++++ docs/reference/get_valid_gene_lists.html | 201 ++++++++++ docs/reference/index.html | 217 +++++++++++ docs/reference/is_not_analysed.html | 168 ++++++++ docs/reference/merge_results.html | 166 ++++++++ vignettes/.gitignore | 2 + vignettes/MultiEWCE.Rmd | 22 +- 34 files changed, 4211 insertions(+), 83 deletions(-) create mode 100644 _pkgdown.yml create mode 100644 docs/404.html create mode 100644 docs/LICENSE-text.html create mode 100644 docs/LICENSE.html create mode 100644 docs/articles/MultiEWCE.html create mode 100644 docs/articles/MultiEWCE_files/figure-html/display-1.png create mode 100644 docs/articles/MultiEWCE_files/header-attrs-2.11/header-attrs.js create mode 100644 docs/articles/index.html create mode 100644 docs/authors.html create mode 100644 docs/bootstrap-toc.css create mode 100644 docs/bootstrap-toc.js create mode 100644 docs/docsearch.css create mode 100644 docs/docsearch.js create mode 100644 docs/index.html create mode 100644 docs/link.svg create mode 100644 docs/pkgdown.css create mode 100644 docs/pkgdown.js create mode 100644 docs/pkgdown.yml create mode 100644 docs/reference/RDA_assign_load.html create mode 100644 docs/reference/Rplot001.png create mode 100644 docs/reference/ewce_para.html create mode 100644 docs/reference/ewce_plot.html create mode 100644 docs/reference/gen_results.html create mode 100644 docs/reference/get_gene_list.html create mode 100644 docs/reference/get_unfinished_list_names.html create mode 100644 docs/reference/get_valid_gene_lists.html create mode 100644 docs/reference/index.html create mode 100644 docs/reference/is_not_analysed.html create mode 100644 docs/reference/merge_results.html diff --git a/.Rbuildignore b/.Rbuildignore index 41ecc98..ef78815 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -3,3 +3,6 @@ ^LICENSE\.md$ ^doc$ ^Meta$ +^_pkgdown\.yml$ +^docs$ +^pkgdown$ diff --git a/.Rhistory b/.Rhistory index 574f1e5..58c0370 100644 --- a/.Rhistory +++ b/.Rhistory @@ -1,75 +1,3 @@ -sctSpecies = "human", -cores = 1, -MergeResults = TRUE) { -# remove gene lists that do not have enough valid genes (>= 4) -list_names <- get_valid_gene_lists(ctd, -list_names = list_names, -gene_data = gene_data, -list_name_column = list_name_column, -gene_column = gene_column) -# Create results directory and remove finished gene lists -if (!file.exists(results_dir)) { -dir.create(results_dir) -} -if (!overwrite_past_analysis) { -list_names <- get_unfinished_list_names(list_names,results_dir) -} -# Run analysis -ewce_para(list_names = list_names, -gene_data = phenotype_to_genes, -list_name_column = "Phenotype", -gene_column = "Gene", -results_directory = results_dir, -ctd_file = ctd, -background_genes = background, -bootstrap_reps = reps, -annotation_Level= annotLevel, -genes_Species = genelistSpecies, -ctd_Species = sctSpecies, -cores = cores) -# Combine results into a single dataframe -if (MergeResults) { -results_final <- merge_results(results_dir = results_dir, -list_name_column = list_name_column) -saveRDS(results_final,paste0("results_",Sys.time(),"_",Sys.Date())) -return(results_final) -} -} -# TEST IT -test_results <- gen_results(ctd = ctd, -gene_data = phenotype_to_genes, -list_names = Phenotypes, -background_genes = background, -list_name_column = "Phenotype", -gene_column = "Gene", -results_dir = "results/", -overwrite_past_analysis = FALSE, -reps = 10, -annotLevel = 1, -genelistSpecies = "human", -sctSpecies = "human", -cores = 1, -MergeResults = TRUE) -#' Is not analysed? -#' -#' Takes a gene list name and checks the output results directory to see if that -#' gene list has been analysed yet. The ewce_para function outputs the results -#' for each gene list in to the results directory with name format list_name.rds -#' @param list_name The name of a gene list e.g. "Phenotypic abnormality" -#' @param results_dir The path to results directory (with "/" at the end) -#' @return True or false -#' @export -is_not_analysed <- function(list_name,results_dir) { -file_path <- paste0(results_dir,list_name,".rds") -if (file.exists(file_path)){ -return (FALSE) -} else { -return (TRUE) -} -} -# TEST IT -test_results <- gen_results(ctd = ctd, -gene_data = phenotype_to_genes, list_names = Phenotypes, background_genes = background, list_name_column = "Phenotype", @@ -510,3 +438,75 @@ load("data/CTD_DescartesHuman.rda") load("tests/testthat/data/CTD_DescartesHuman.rda") devtools::test() devtools::test() +phenotype_to_genes = load_phenotype_to_genes("data/phenotype_to_genes.txt") +library(HPOExplorer) +phenotype_to_genes = load_phenotype_to_genes("data/phenotype_to_genes.txt") +phenotype_to_genes = load_phenotype_to_genes("tests/testhat/data/phenotype_to_genes.txt") +phenotype_to_genes = load_phenotype_to_genes("tests/testthat/data/phenotype_to_genes.txt") +devtools::load_all() +?ewce_para +load("tests/testthat/data/CTD_DescartesHuman.rda") +Phenos1 = unique(phenotype_to_genes$Phenotype)[1:5] +Phenos2 = unique(phenotype_to_genes$Phenotype)[1:10] +results1 <- ewce_para(Phenos1, +phenotype_to_genes, +list_name_column = "Phenotype", +gene_column ="Gene", +results_directory = "results", +ctd_file = ctd, +background_genes = unique(phenotype_to_genes$Gene), +bootstrap_reps = 10, +annotation_Level = 1, +genes_Species = "human", +ctd_Species = "human", +cores = 1) +mkdir("results") +file.create("results") +dir.create("results") +file.create("results") +dir.create("results") +results1 <- ewce_para(Phenos1, +phenotype_to_genes, +list_name_column = "Phenotype", +gene_column ="Gene", +results_directory = "results", +ctd_file = ctd, +background_genes = unique(phenotype_to_genes$Gene), +bootstrap_reps = 10, +annotation_Level = 1, +genes_Species = "human", +ctd_Species = "human", +cores = 1) +dir.create(tests/testthat/data/results) +dir.create("tests/testthat/data/results") +devtools::test() +devtools::test() +devtools::test() +devtools::test() +devtools::test() +devtools::test() +devtools::test() +resultsdir = "data/results" +for (f in list.files(paste0("tests/testthat/",resultsdir))) { +file.remove(paste0("tests/testthat/",resultsdir,f)) +} +for (f in list.files(paste0("tests/testthat/",resultsdir))) { +file.remove(paste0("tests/testthat/",resultsdir,"/",f)) +} +roxygen2::roxygenise() +?gen_results +devtools::test() +devtools::test() +devtools::test() +devtools::test() +dir.create("testing/test") +dir.create("testing") +file.remove("testing") +dir.remove("testing") +remove.file("testing") +file.remove("testing") +dir.remove("testing") +devtools::test() +devtools::check() +devtools::test() +devtools::check() diff --git a/.gitignore b/.gitignore index 9f583b9..318655d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ inst/doc /doc/ /Meta/ tests/testthat/data/ + diff --git a/_pkgdown.yml b/_pkgdown.yml new file mode 100644 index 0000000..c9cafa0 --- /dev/null +++ b/_pkgdown.yml @@ -0,0 +1,5 @@ +url: ~ + +template: + params: + bootswatch: cerulean diff --git a/docs/404.html b/docs/404.html new file mode 100644 index 0000000..05f0f9a --- /dev/null +++ b/docs/404.html @@ -0,0 +1,143 @@ + + + + + + + + +Page not found (404) • MultiEWCE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+ + +Content not found. Please use links in the navbar. + +
+ + + +
+ + + +
+ + +
+

Site built with pkgdown 1.6.1.

+
+ +
+
+ + + + + + + + diff --git a/docs/LICENSE-text.html b/docs/LICENSE-text.html new file mode 100644 index 0000000..aac68f3 --- /dev/null +++ b/docs/LICENSE-text.html @@ -0,0 +1,145 @@ + + + + + + + + +License • MultiEWCE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+ + +
YEAR: 2021
+COPYRIGHT HOLDER: MultiEWCE authors
+
+ +
+ + + +
+ + + +
+ + +
+

Site built with pkgdown 1.6.1.

+
+ +
+
+ + + + + + + + diff --git a/docs/LICENSE.html b/docs/LICENSE.html new file mode 100644 index 0000000..e5f0f88 --- /dev/null +++ b/docs/LICENSE.html @@ -0,0 +1,149 @@ + + + + + + + + +MIT License • MultiEWCE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+ + +
+ +

Copyright (c) 2021 MultiEWCE authors

+

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

+

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

+

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+
+ +
+ + + +
+ + + +
+ + +
+

Site built with pkgdown 1.6.1.

+
+ +
+
+ + + + + + + + diff --git a/docs/articles/MultiEWCE.html b/docs/articles/MultiEWCE.html new file mode 100644 index 0000000..e581374 --- /dev/null +++ b/docs/articles/MultiEWCE.html @@ -0,0 +1,363 @@ + + + + + + + +Expression Weighted Celltype Enrichment on Multiple Gene Lists With MultiEWCE • MultiEWCE + + + + + + + + + + +
+
+ + + + +
+
+ + + + +
+library(MultiEWCE)
+
+

+Introduction

+

The MultiEWCE package is an extension of the EWCE package. It is designed to run expression weighted celltype enrichment (EWCE) on multiple gene lists in parallel. The results are then stored both as separate .rds files, one for each individual EWCE analysis, as well as a in a single dataframe containing all the results.

+

This package is useful in cases where you have a large number of related, but separate, gene lists. In this vignette we will use an example from the Human Phenotype Ontology (HPO). The HPO contains over 9000 clinically relevant phenotypes annotated with lists of genes that have been found to be associated with the particular phenotype.

+
+
+

+Installation

+

This tutorial will require the MultiEWCE package and a few additional packages related to the particular dataset we will be using. Install and load these with the following R code:

+
+# if (!require("devtools")) {
+#   install.packages("devtools")
+# }
+if (!require("HPOExplorer")) {
+  devtools::install_github("ovrhuman/HPOExplorer")
+}
+#if (!require("MultiEWCE")) {
+#  devtools::install_github("ovrhuman/MultiEWCE")
+#}
+
+
+

+Loading Phenotype Associated Gene Lists from the HPO

+

The MultiEWCE package requires the gene data to be in a particular format. It must be a data.frame that includes one column of gene list names, and another column of genes. For example:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PhenotypeGene
“Abnormal heart”gene X
“Abnormal heart”gene Y
“Poor vision”gene Z
“Poor vision”gene Y
“Poor vision”gene W
“Short stature”gene V
+

etc…

+

Now we will get a dataset like this from the HPO.

+
+# Download phenotype associated gene data
+#HPOExplorer::download_phenotype_to_genes("phenotype_to_genes.txt")
+
+# Load data into the environment
+gene_data <- HPOExplorer::load_phenotype_to_genes("phenotype_to_genes.txt")
+
+print(head(gene_data))
+#>           ID                  Phenotype EntrezID     Gene Additional    Source
+#> 1 HP:0000002 Abnormality of body height     5073     PARN            orphadata
+#> 2 HP:0000002 Abnormality of body height    10084    PQBP1            orphadata
+#> 3 HP:0000002 Abnormality of body height    50485 SMARCAL1          -  mim2gene
+#> 4 HP:0000002 Abnormality of body height     2317     FLNB            orphadata
+#> 5 HP:0000002 Abnormality of body height    79648    MCPH1          -  mim2gene
+#> 6 HP:0000002 Abnormality of body height      523  ATP6V1A          -  mim2gene
+#>        LinkID
+#> 1  ORPHA:1775
+#> 2 ORPHA:93950
+#> 3 OMIM:242900
+#> 4   ORPHA:503
+#> 5 OMIM:251200
+#> 6 OMIM:617403
+

In this example our gene list names column is called Phenotype and our column of genes is called Gene. However, different column names can be specified to the MultiEWCE package.

+
+
+

+Setting up input arguments for the gen_results function

+
+ctd <- readRDS("CTD_Descartes_withplot.rds")
+list_names <- unique(gene_data$Phenotype)[1:10]
+background_genes <- unique(gene_data$Gene)
+list_name_column <- "Phenotype"
+gene_column <- "Gene"
+results_dir <- "results"
+overwrite_past_analysis <- FALSE
+MergeResults <- TRUE
+reps <- 10
+annotLevel <- 1
+genelistSpecies <- "human"
+sctSpecies <- "human"
+cores <- 1
+
+

+ctd

+

The ctd (cell type data) file contains the single cell RNA sequence data that is required for EWCE. for further information about generating a ctd please see the EWCE documentation. In this example we will use a CTD of human gene expression data, generated from the Descartes Human Cell Atlas. Replace this with your own CTD file.

+
+
+

+gene_data

+

Gene data is the dataframe containin gene list names and genes, in this case we have already loaded it and assigned it to the variable gene_data.

+
+
+

+list_names

+

This is a character vector containing all the gene list names. This can be obtained from your gene_data as follows. To save time in this example analysis we will only use the first 10 gene lists ([1:10])

+
+
+

+background_genes

+

This is a character vector of genes to be used as the background genes. See EWCE package docs for more details on background genes.

+
+
+

+Column names

+

list_name_column is the name of the column in gene_data that contains the gene list names and gene_column contains the genes.

+
+
+

+Processing results arguments

+

The results_dir argument is the path to the directory where the individual EWCE results will be saved.

+

The overwrite_past_analysis argument can be set to TRUE or FALSE and states if you want to redo and overwrite analysis of gene lists that have already been saved to the results_dir. Setting this to FALSE is useful in cases where you stopped an analysis midway and would like to carry on from where you left off.

+

MergeResults is another TRUE/FALSE argument. If TRUE, gen_results will also return a single dataframe containing all of the results from all gene lists. A .rds file of these merged results will also be saved to your current working directory in a file called “results_<datetime_of_analysis>.rds” ## Number of cores The cores argument is the number of cores you would like to run in parallel. This is dependent on what is available to you on your computer. In this case we will just run it on one core, no parallelism.

+
+
+

+EWCE::bootstrap_enrichment_test arguments

+

The gen_results function calls the EWCE bootstrap_enrichment_test function. Here we set the input parameters related to this.

+

reps is the number of bootstrap reps to run, for this tutorial we will only do 10 to save time, but typically you would want to do closer to 100,000.

+

annotLevel is the level of cell type specificity to use from the ctd file. genelistSpecies can be “human” or “mouse” and is the species of the genes in the gene lists.

+

sctSpecies is the species of the CTD data, also can be “human” or “mouse”.

+
+
+
+

+Run analysis

+

Now we have set up all our desired inputs, we can run the analysis.

+
+all_results <-MultiEWCE::gen_results(ctd,
+                           gene_data,
+                           list_names,
+                           background_genes,
+                           list_name_column,
+                           gene_column,
+                           results_dir,
+                           overwrite_past_analysis,
+                           reps,
+                           annotLevel,
+                           genelistSpecies,
+                           sctSpecies,
+                           cores,
+                           MergeResults) 
+
+
+

+Adjust for multiple comparisons

+

Seeing as we have ran EWCE on multiple gene lists, we need to make adjustments for multiple comparisons. We can use Benjamini-Hochberg procedure to false discovery rate adjusted p values (which we will call q values here).

+
+all_results$q <- stats::p.adjust(all_results$p, method = "BH")
+
+print(head(all_results))
+#>                                          CellType annotLevel   p fold_change
+#> AFP_ALB_positive_cells     AFP_ALB_positive_cells          1 1.0   0.4272957
+#> Acinar_cells                         Acinar_cells          1 1.0   0.5842171
+#> Adrenocortical_cells         Adrenocortical_cells          1 0.8   0.9506813
+#> Amacrine_cells                     Amacrine_cells          1 1.0   0.6769709
+#> Antigen_presenting_cells Antigen_presenting_cells          1 1.0   0.6388861
+#> Astrocytes                             Astrocytes          1 0.5   0.9489154
+#>                          sd_from_mean
+#> AFP_ALB_positive_cells     -3.8668595
+#> Acinar_cells               -2.4460971
+#> Adrenocortical_cells       -0.8480984
+#> Amacrine_cells             -6.2117392
+#> Antigen_presenting_cells   -4.5347799
+#> Astrocytes                 -0.4808309
+#>                                                                 Phenotype q
+#> AFP_ALB_positive_cells   Abnormal morphology of female internal genitalia 1
+#> Acinar_cells             Abnormal morphology of female internal genitalia 1
+#> Adrenocortical_cells     Abnormal morphology of female internal genitalia 1
+#> Amacrine_cells           Abnormal morphology of female internal genitalia 1
+#> Antigen_presenting_cells Abnormal morphology of female internal genitalia 1
+#> Astrocytes               Abnormal morphology of female internal genitalia 1
+
+
+

+Visualise the results

+

Just as an example, we will create a plot showing the number of significant enrichments per phenotype in the all_results data.frame. We will use q <= 0.05 as the significance threshold.

+
+library(ggplot2)
+
+n_signif <- data.frame()
+for (p in unique(all_results$Phenotype)) {
+  n_signif <- rbind(n_signif, 
+                    data.frame("Phenotype" = p
+                               ,"signif_enrichments"=length(
+                                 all_results$q[all_results$Phenotype == p &
+                                                 all_results$q <= 0.05])))
+}
+
+
+plot1 <-  ggplot(n_signif, aes(Phenotype,signif_enrichments)) +
+    geom_col() +
+    xlab("Phenotype") +
+    ylab("Enrichments (n)") +
+    theme_bw() +
+    theme(axis.text.x = element_text(angle=90,vjust = 0.5, hjust = 1))
+
+print(plot1)
+

+
+
+

+Other functions in MultiEWCE

+
+

+merge_results

+

If you have a results directory of individual EWCE results but do not have the merged dataframe of all results, you can call the merge_results function manually. The results_dir argument is the path to your results directory and the list_name_column argument is the name of the column containing gene list names. In this case we used “Phenotype” as this column name when we generated the results.

+
+all_results_2 <- MultiEWCE::merge_results(results_dir = "results",
+                                          list_name_column = "Phenotype")
+
+
+

+get_gene_list

+

This function gets a character vector of genes assocaited with a particular gene list name.

+
+eye_contact_genes <- MultiEWCE::get_gene_list(list_name = "Poor eye contact", 
+                                      gene_data = gene_data,
+                                      list_name_column = "Phenotype",
+                                      gene_column = "Gene")
+
+cat(paste("5 genes associated with poor eye contact:",paste(eye_contact_genes[1:5],collapse = " ")))
+#> 5 genes associated with poor eye contact: TWNK PIGP CDKL5 NDUFAF4 NDUFC2
+
+
+

+get_unfinished_list_names

+

This function is used to find which gene lists you have not yet analysed

+
+unfinished <- MultiEWCE::get_unfinished_list_names(list_names = unique(gene_data$Phenotype)[1:15],
+                                        results_dir = "results")
+cat(paste0("Gene lists not yet analysed:\n",paste(unfinished, collapse = ",\n")))
+#> Gene lists not yet analysed:
+#> Abnormality of the bladder,
+#> Bladder diverticulum,
+#> Urinary retention,
+#> Nocturia,
+#> Migrating focal seizure
+
+
+
+ + + +
+ + + +
+ +
+

Site built with pkgdown 1.6.1.

+
+ +
+
+ + + + + + diff --git a/docs/articles/MultiEWCE_files/figure-html/display-1.png b/docs/articles/MultiEWCE_files/figure-html/display-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f841b37f996429dc16726e0735f5b23f22c32a46 GIT binary patch literal 80152 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 :first-child"); + var i, h, a; + for (i = 0; i < hs.length; i++) { + h = hs[i]; + if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 + a = h.attributes; + while (a.length > 0) h.removeAttribute(a[0].name); + } +}); diff --git a/docs/articles/index.html b/docs/articles/index.html new file mode 100644 index 0000000..70e6c29 --- /dev/null +++ b/docs/articles/index.html @@ -0,0 +1,142 @@ + + + + + + + + +Articles • MultiEWCE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+ + + +
+
+ + +
+ + +
+

Site built with pkgdown 1.6.1.

+
+ +
+
+ + + + + + + + diff --git a/docs/authors.html b/docs/authors.html new file mode 100644 index 0000000..8c939eb --- /dev/null +++ b/docs/authors.html @@ -0,0 +1,142 @@ + + + + + + + + +Authors • MultiEWCE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+ + +
    +
  • +

    First Last. Author, maintainer. +

    +
  • +
+ +
+ +
+ + + +
+ + +
+

Site built with pkgdown 1.6.1.

+
+ +
+
+ + + + + + + + diff --git a/docs/bootstrap-toc.css b/docs/bootstrap-toc.css new file mode 100644 index 0000000..5a85941 --- /dev/null +++ b/docs/bootstrap-toc.css @@ -0,0 +1,60 @@ +/*! + * Bootstrap Table of Contents v0.4.1 (http://afeld.github.io/bootstrap-toc/) + * Copyright 2015 Aidan Feldman + * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ + +/* modified from https://github.com/twbs/bootstrap/blob/94b4076dd2efba9af71f0b18d4ee4b163aa9e0dd/docs/assets/css/src/docs.css#L548-L601 */ + +/* All levels of nav */ +nav[data-toggle='toc'] .nav > li > a { + display: block; + padding: 4px 20px; + font-size: 13px; + font-weight: 500; + color: #767676; +} +nav[data-toggle='toc'] .nav > li > a:hover, +nav[data-toggle='toc'] .nav > li > a:focus { + padding-left: 19px; + color: #563d7c; + text-decoration: none; + background-color: transparent; + border-left: 1px solid #563d7c; +} +nav[data-toggle='toc'] .nav > .active > a, +nav[data-toggle='toc'] .nav > .active:hover > a, +nav[data-toggle='toc'] .nav > .active:focus > a { + padding-left: 18px; + font-weight: bold; + color: #563d7c; + background-color: transparent; + border-left: 2px solid #563d7c; +} + +/* Nav: second level (shown on .active) */ +nav[data-toggle='toc'] .nav .nav { + display: none; /* Hide by default, but at >768px, show it */ + padding-bottom: 10px; +} +nav[data-toggle='toc'] .nav .nav > li > a { + padding-top: 1px; + padding-bottom: 1px; + padding-left: 30px; + font-size: 12px; + font-weight: normal; +} +nav[data-toggle='toc'] .nav .nav > li > a:hover, +nav[data-toggle='toc'] .nav .nav > li > a:focus { + padding-left: 29px; +} +nav[data-toggle='toc'] .nav .nav > .active > a, +nav[data-toggle='toc'] .nav .nav > .active:hover > a, +nav[data-toggle='toc'] .nav .nav > .active:focus > a { + padding-left: 28px; + font-weight: 500; +} + +/* from https://github.com/twbs/bootstrap/blob/e38f066d8c203c3e032da0ff23cd2d6098ee2dd6/docs/assets/css/src/docs.css#L631-L634 */ +nav[data-toggle='toc'] .nav > .active > ul { + display: block; +} diff --git a/docs/bootstrap-toc.js b/docs/bootstrap-toc.js new file mode 100644 index 0000000..1cdd573 --- /dev/null +++ b/docs/bootstrap-toc.js @@ -0,0 +1,159 @@ +/*! + * Bootstrap Table of Contents v0.4.1 (http://afeld.github.io/bootstrap-toc/) + * Copyright 2015 Aidan Feldman + * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */ +(function() { + 'use strict'; + + window.Toc = { + helpers: { + // return all matching elements in the set, or their descendants + findOrFilter: function($el, selector) { + // http://danielnouri.org/notes/2011/03/14/a-jquery-find-that-also-finds-the-root-element/ + // http://stackoverflow.com/a/12731439/358804 + var $descendants = $el.find(selector); + return $el.filter(selector).add($descendants).filter(':not([data-toc-skip])'); + }, + + generateUniqueIdBase: function(el) { + var text = $(el).text(); + var anchor = text.trim().toLowerCase().replace(/[^A-Za-z0-9]+/g, '-'); + return anchor || el.tagName.toLowerCase(); + }, + + generateUniqueId: function(el) { + var anchorBase = this.generateUniqueIdBase(el); + for (var i = 0; ; i++) { + var anchor = anchorBase; + if (i > 0) { + // add suffix + anchor += '-' + i; + } + // check if ID already exists + if (!document.getElementById(anchor)) { + return anchor; + } + } + }, + + generateAnchor: function(el) { + if (el.id) { + return el.id; + } else { + var anchor = this.generateUniqueId(el); + el.id = anchor; + return anchor; + } + }, + + createNavList: function() { + return $(''); + }, + + createChildNavList: function($parent) { + var $childList = this.createNavList(); + $parent.append($childList); + return $childList; + }, + + generateNavEl: function(anchor, text) { + var $a = $(''); + $a.attr('href', '#' + anchor); + $a.text(text); + var $li = $('
  • '); + $li.append($a); + return $li; + }, + + generateNavItem: function(headingEl) { + var anchor = this.generateAnchor(headingEl); + var $heading = $(headingEl); + var text = $heading.data('toc-text') || $heading.text(); + return this.generateNavEl(anchor, text); + }, + + // Find the first heading level (`

    `, then `

    `, etc.) that has more than one element. Defaults to 1 (for `

    `). + getTopLevel: function($scope) { + for (var i = 1; i <= 6; i++) { + var $headings = this.findOrFilter($scope, 'h' + i); + if ($headings.length > 1) { + return i; + } + } + + return 1; + }, + + // returns the elements for the top level, and the next below it + getHeadings: function($scope, topLevel) { + var topSelector = 'h' + topLevel; + + var secondaryLevel = topLevel + 1; + var secondarySelector = 'h' + secondaryLevel; + + return this.findOrFilter($scope, topSelector + ',' + secondarySelector); + }, + + getNavLevel: function(el) { + return parseInt(el.tagName.charAt(1), 10); + }, + + populateNav: function($topContext, topLevel, $headings) { + var $context = $topContext; + var $prevNav; + + var helpers = this; + $headings.each(function(i, el) { + var $newNav = helpers.generateNavItem(el); + var navLevel = helpers.getNavLevel(el); + + // determine the proper $context + if (navLevel === topLevel) { + // use top level + $context = $topContext; + } else if ($prevNav && $context === $topContext) { + // create a new level of the tree and switch to it + $context = helpers.createChildNavList($prevNav); + } // else use the current $context + + $context.append($newNav); + + $prevNav = $newNav; + }); + }, + + parseOps: function(arg) { + var opts; + if (arg.jquery) { + opts = { + $nav: arg + }; + } else { + opts = arg; + } + opts.$scope = opts.$scope || $(document.body); + return opts; + } + }, + + // accepts a jQuery object, or an options object + init: function(opts) { + opts = this.helpers.parseOps(opts); + + // ensure that the data attribute is in place for styling + opts.$nav.attr('data-toggle', 'toc'); + + var $topContext = this.helpers.createChildNavList(opts.$nav); + var topLevel = this.helpers.getTopLevel(opts.$scope); + var $headings = this.helpers.getHeadings(opts.$scope, topLevel); + this.helpers.populateNav($topContext, topLevel, $headings); + } + }; + + $(function() { + $('nav[data-toggle="toc"]').each(function(i, el) { + var $nav = $(el); + Toc.init($nav); + }); + }); +})(); diff --git a/docs/docsearch.css b/docs/docsearch.css new file mode 100644 index 0000000..e5f1fe1 --- /dev/null +++ b/docs/docsearch.css @@ -0,0 +1,148 @@ +/* Docsearch -------------------------------------------------------------- */ +/* + Source: https://github.com/algolia/docsearch/ + License: MIT +*/ + +.algolia-autocomplete { + display: block; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1 +} + +.algolia-autocomplete .ds-dropdown-menu { + width: 100%; + min-width: none; + max-width: none; + padding: .75rem 0; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, .1); + box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .175); +} + +@media (min-width:768px) { + .algolia-autocomplete .ds-dropdown-menu { + width: 175% + } +} + +.algolia-autocomplete .ds-dropdown-menu::before { + display: none +} + +.algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-] { + padding: 0; + background-color: rgb(255,255,255); + border: 0; + max-height: 80vh; +} + +.algolia-autocomplete .ds-dropdown-menu .ds-suggestions { + margin-top: 0 +} + +.algolia-autocomplete .algolia-docsearch-suggestion { + padding: 0; + overflow: visible +} + +.algolia-autocomplete .algolia-docsearch-suggestion--category-header { + padding: .125rem 1rem; + margin-top: 0; + font-size: 1.3em; + font-weight: 500; + color: #00008B; + border-bottom: 0 +} + +.algolia-autocomplete .algolia-docsearch-suggestion--wrapper { + float: none; + padding-top: 0 +} + +.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column { + float: none; + width: auto; + padding: 0; + text-align: left +} + +.algolia-autocomplete .algolia-docsearch-suggestion--content { + float: none; + width: auto; + padding: 0 +} + +.algolia-autocomplete .algolia-docsearch-suggestion--content::before { + display: none +} + +.algolia-autocomplete .ds-suggestion:not(:first-child) .algolia-docsearch-suggestion--category-header { + padding-top: .75rem; + margin-top: .75rem; + border-top: 1px solid rgba(0, 0, 0, .1) +} + +.algolia-autocomplete .ds-suggestion .algolia-docsearch-suggestion--subcategory-column { + display: block; + padding: .1rem 1rem; + margin-bottom: 0.1; + font-size: 1.0em; + font-weight: 400 + /* display: none */ +} + +.algolia-autocomplete .algolia-docsearch-suggestion--title { + display: block; + padding: .25rem 1rem; + margin-bottom: 0; + font-size: 0.9em; + font-weight: 400 +} + +.algolia-autocomplete .algolia-docsearch-suggestion--text { + padding: 0 1rem .5rem; + margin-top: -.25rem; + font-size: 0.8em; + font-weight: 400; + line-height: 1.25 +} + +.algolia-autocomplete .algolia-docsearch-footer { + width: 110px; + height: 20px; + z-index: 3; + margin-top: 10.66667px; + float: right; + font-size: 0; + line-height: 0; +} + +.algolia-autocomplete .algolia-docsearch-footer--logo { + background-image: url("data:image/svg+xml;utf8,"); + background-repeat: no-repeat; + background-position: 50%; + background-size: 100%; + overflow: hidden; + text-indent: -9000px; + width: 100%; + height: 100%; + display: block; + transform: translate(-8px); +} + +.algolia-autocomplete .algolia-docsearch-suggestion--highlight { + color: #FF8C00; + background: rgba(232, 189, 54, 0.1) +} + + +.algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight { + box-shadow: inset 0 -2px 0 0 rgba(105, 105, 105, .5) +} + +.algolia-autocomplete .ds-suggestion.ds-cursor .algolia-docsearch-suggestion--content { + background-color: rgba(192, 192, 192, .15) +} diff --git a/docs/docsearch.js b/docs/docsearch.js new file mode 100644 index 0000000..b35504c --- /dev/null +++ b/docs/docsearch.js @@ -0,0 +1,85 @@ +$(function() { + + // register a handler to move the focus to the search bar + // upon pressing shift + "/" (i.e. "?") + $(document).on('keydown', function(e) { + if (e.shiftKey && e.keyCode == 191) { + e.preventDefault(); + $("#search-input").focus(); + } + }); + + $(document).ready(function() { + // do keyword highlighting + /* modified from https://jsfiddle.net/julmot/bL6bb5oo/ */ + var mark = function() { + + var referrer = document.URL ; + var paramKey = "q" ; + + if (referrer.indexOf("?") !== -1) { + var qs = referrer.substr(referrer.indexOf('?') + 1); + var qs_noanchor = qs.split('#')[0]; + var qsa = qs_noanchor.split('&'); + var keyword = ""; + + for (var i = 0; i < qsa.length; i++) { + var currentParam = qsa[i].split('='); + + if (currentParam.length !== 2) { + continue; + } + + if (currentParam[0] == paramKey) { + keyword = decodeURIComponent(currentParam[1].replace(/\+/g, "%20")); + } + } + + if (keyword !== "") { + $(".contents").unmark({ + done: function() { + $(".contents").mark(keyword); + } + }); + } + } + }; + + mark(); + }); +}); + +/* Search term highlighting ------------------------------*/ + +function matchedWords(hit) { + var words = []; + + var hierarchy = hit._highlightResult.hierarchy; + // loop to fetch from lvl0, lvl1, etc. + for (var idx in hierarchy) { + words = words.concat(hierarchy[idx].matchedWords); + } + + var content = hit._highlightResult.content; + if (content) { + words = words.concat(content.matchedWords); + } + + // return unique words + var words_uniq = [...new Set(words)]; + return words_uniq; +} + +function updateHitURL(hit) { + + var words = matchedWords(hit); + var url = ""; + + if (hit.anchor) { + url = hit.url_without_anchor + '?q=' + escape(words.join(" ")) + '#' + hit.anchor; + } else { + url = hit.url + '?q=' + escape(words.join(" ")); + } + + return url; +} diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..5aafa19 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,111 @@ + + + + + + + +What the Package Does (One Line, Title Case) • MultiEWCE + + + + + + + + + + +
    +
    + + + + +
    +
    +
    + +

    R package for analysing multiple gene lists in parallel using EWCE

    +
    +

    +Tutorial

    +

    Here is a vignette to help you get started.

    +
    +
    +
    + + +
    + + +
    + +
    +

    Site built with pkgdown 1.6.1.

    +
    + +
    +
    + + + + + + diff --git a/docs/link.svg b/docs/link.svg new file mode 100644 index 0000000..88ad827 --- /dev/null +++ b/docs/link.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/docs/pkgdown.css b/docs/pkgdown.css new file mode 100644 index 0000000..1273238 --- /dev/null +++ b/docs/pkgdown.css @@ -0,0 +1,367 @@ +/* Sticky footer */ + +/** + * Basic idea: https://philipwalton.github.io/solved-by-flexbox/demos/sticky-footer/ + * Details: https://github.com/philipwalton/solved-by-flexbox/blob/master/assets/css/components/site.css + * + * .Site -> body > .container + * .Site-content -> body > .container .row + * .footer -> footer + * + * Key idea seems to be to ensure that .container and __all its parents__ + * have height set to 100% + * + */ + +html, body { + height: 100%; +} + +body { + position: relative; +} + +body > .container { + display: flex; + height: 100%; + flex-direction: column; +} + +body > .container .row { + flex: 1 0 auto; +} + +footer { + margin-top: 45px; + padding: 35px 0 36px; + border-top: 1px solid #e5e5e5; + color: #666; + display: flex; + flex-shrink: 0; +} +footer p { + margin-bottom: 0; +} +footer div { + flex: 1; +} +footer .pkgdown { + text-align: right; +} +footer p { + margin-bottom: 0; +} + +img.icon { + float: right; +} + +img { + max-width: 100%; +} + +/* Fix bug in bootstrap (only seen in firefox) */ +summary { + display: list-item; +} + +/* Typographic tweaking ---------------------------------*/ + +.contents .page-header { + margin-top: calc(-60px + 1em); +} + +dd { + margin-left: 3em; +} + +/* Section anchors ---------------------------------*/ + +a.anchor { + margin-left: -30px; + display:inline-block; + width: 30px; + height: 30px; + visibility: hidden; + + background-image: url(./link.svg); + background-repeat: no-repeat; + background-size: 20px 20px; + background-position: center center; +} + +.hasAnchor:hover a.anchor { + visibility: visible; +} + +@media (max-width: 767px) { + .hasAnchor:hover a.anchor { + visibility: hidden; + } +} + + +/* Fixes for fixed navbar --------------------------*/ + +.contents h1, .contents h2, .contents h3, .contents h4 { + padding-top: 60px; + margin-top: -40px; +} + +/* Navbar submenu --------------------------*/ + +.dropdown-submenu { + position: relative; +} + +.dropdown-submenu>.dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + border-radius: 0 6px 6px 6px; +} + +.dropdown-submenu:hover>.dropdown-menu { + display: block; +} + +.dropdown-submenu>a:after { + display: block; + content: " "; + float: right; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + border-width: 5px 0 5px 5px; + border-left-color: #cccccc; + margin-top: 5px; + margin-right: -10px; +} + +.dropdown-submenu:hover>a:after { + border-left-color: #ffffff; +} + +.dropdown-submenu.pull-left { + float: none; +} + +.dropdown-submenu.pull-left>.dropdown-menu { + left: -100%; + margin-left: 10px; + border-radius: 6px 0 6px 6px; +} + +/* Sidebar --------------------------*/ + +#pkgdown-sidebar { + margin-top: 30px; + position: -webkit-sticky; + position: sticky; + top: 70px; +} + +#pkgdown-sidebar h2 { + font-size: 1.5em; + margin-top: 1em; +} + +#pkgdown-sidebar h2:first-child { + margin-top: 0; +} + +#pkgdown-sidebar .list-unstyled li { + margin-bottom: 0.5em; +} + +/* bootstrap-toc tweaks ------------------------------------------------------*/ + +/* All levels of nav */ + +nav[data-toggle='toc'] .nav > li > a { + padding: 4px 20px 4px 6px; + font-size: 1.5rem; + font-weight: 400; + color: inherit; +} + +nav[data-toggle='toc'] .nav > li > a:hover, +nav[data-toggle='toc'] .nav > li > a:focus { + padding-left: 5px; + color: inherit; + border-left: 1px solid #878787; +} + +nav[data-toggle='toc'] .nav > .active > a, +nav[data-toggle='toc'] .nav > .active:hover > a, +nav[data-toggle='toc'] .nav > .active:focus > a { + padding-left: 5px; + font-size: 1.5rem; + font-weight: 400; + color: inherit; + border-left: 2px solid #878787; +} + +/* Nav: second level (shown on .active) */ + +nav[data-toggle='toc'] .nav .nav { + display: none; /* Hide by default, but at >768px, show it */ + padding-bottom: 10px; +} + +nav[data-toggle='toc'] .nav .nav > li > a { + padding-left: 16px; + font-size: 1.35rem; +} + +nav[data-toggle='toc'] .nav .nav > li > a:hover, +nav[data-toggle='toc'] .nav .nav > li > a:focus { + padding-left: 15px; +} + +nav[data-toggle='toc'] .nav .nav > .active > a, +nav[data-toggle='toc'] .nav .nav > .active:hover > a, +nav[data-toggle='toc'] .nav .nav > .active:focus > a { + padding-left: 15px; + font-weight: 500; + font-size: 1.35rem; +} + +/* orcid ------------------------------------------------------------------- */ + +.orcid { + font-size: 16px; + color: #A6CE39; + /* margins are required by official ORCID trademark and display guidelines */ + margin-left:4px; + margin-right:4px; + vertical-align: middle; +} + +/* Reference index & topics ----------------------------------------------- */ + +.ref-index th {font-weight: normal;} + +.ref-index td {vertical-align: top; min-width: 100px} +.ref-index .icon {width: 40px;} +.ref-index .alias {width: 40%;} +.ref-index-icons .alias {width: calc(40% - 40px);} +.ref-index .title {width: 60%;} + +.ref-arguments th {text-align: right; padding-right: 10px;} +.ref-arguments th, .ref-arguments td {vertical-align: top; min-width: 100px} +.ref-arguments .name {width: 20%;} +.ref-arguments .desc {width: 80%;} + +/* Nice scrolling for wide elements --------------------------------------- */ + +table { + display: block; + overflow: auto; +} + +/* Syntax highlighting ---------------------------------------------------- */ + +pre { + word-wrap: normal; + word-break: normal; + border: 1px solid #eee; +} + +pre, code { + background-color: #f8f8f8; + color: #333; +} + +pre code { + overflow: auto; + word-wrap: normal; + white-space: pre; +} + +pre .img { + margin: 5px 0; +} + +pre .img img { + background-color: #fff; + display: block; + height: auto; +} + +code a, pre a { + color: #375f84; +} + +a.sourceLine:hover { + text-decoration: none; +} + +.fl {color: #1514b5;} +.fu {color: #000000;} /* function */ +.ch,.st {color: #036a07;} /* string */ +.kw {color: #264D66;} /* keyword */ +.co {color: #888888;} /* comment */ + +.message { color: black; font-weight: bolder;} +.error { color: orange; font-weight: bolder;} +.warning { color: #6A0366; font-weight: bolder;} + +/* Clipboard --------------------------*/ + +.hasCopyButton { + position: relative; +} + +.btn-copy-ex { + position: absolute; + right: 0; + top: 0; + visibility: hidden; +} + +.hasCopyButton:hover button.btn-copy-ex { + visibility: visible; +} + +/* headroom.js ------------------------ */ + +.headroom { + will-change: transform; + transition: transform 200ms linear; +} +.headroom--pinned { + transform: translateY(0%); +} +.headroom--unpinned { + transform: translateY(-100%); +} + +/* mark.js ----------------------------*/ + +mark { + background-color: rgba(255, 255, 51, 0.5); + border-bottom: 2px solid rgba(255, 153, 51, 0.3); + padding: 1px; +} + +/* vertical spacing after htmlwidgets */ +.html-widget { + margin-bottom: 10px; +} + +/* fontawesome ------------------------ */ + +.fab { + font-family: "Font Awesome 5 Brands" !important; +} + +/* don't display links in code chunks when printing */ +/* source: https://stackoverflow.com/a/10781533 */ +@media print { + code a:link:after, code a:visited:after { + content: ""; + } +} diff --git a/docs/pkgdown.js b/docs/pkgdown.js new file mode 100644 index 0000000..7e7048f --- /dev/null +++ b/docs/pkgdown.js @@ -0,0 +1,108 @@ +/* http://gregfranko.com/blog/jquery-best-practices/ */ +(function($) { + $(function() { + + $('.navbar-fixed-top').headroom(); + + $('body').css('padding-top', $('.navbar').height() + 10); + $(window).resize(function(){ + $('body').css('padding-top', $('.navbar').height() + 10); + }); + + $('[data-toggle="tooltip"]').tooltip(); + + var cur_path = paths(location.pathname); + var links = $("#navbar ul li a"); + var max_length = -1; + var pos = -1; + for (var i = 0; i < links.length; i++) { + if (links[i].getAttribute("href") === "#") + continue; + // Ignore external links + if (links[i].host !== location.host) + continue; + + var nav_path = paths(links[i].pathname); + + var length = prefix_length(nav_path, cur_path); + if (length > max_length) { + max_length = length; + pos = i; + } + } + + // Add class to parent
  • , and enclosing
  • if in dropdown + if (pos >= 0) { + var menu_anchor = $(links[pos]); + menu_anchor.parent().addClass("active"); + menu_anchor.closest("li.dropdown").addClass("active"); + } + }); + + function paths(pathname) { + var pieces = pathname.split("/"); + pieces.shift(); // always starts with / + + var end = pieces[pieces.length - 1]; + if (end === "index.html" || end === "") + pieces.pop(); + return(pieces); + } + + // Returns -1 if not found + function prefix_length(needle, haystack) { + if (needle.length > haystack.length) + return(-1); + + // Special case for length-0 haystack, since for loop won't run + if (haystack.length === 0) { + return(needle.length === 0 ? 0 : -1); + } + + for (var i = 0; i < haystack.length; i++) { + if (needle[i] != haystack[i]) + return(i); + } + + return(haystack.length); + } + + /* Clipboard --------------------------*/ + + function changeTooltipMessage(element, msg) { + var tooltipOriginalTitle=element.getAttribute('data-original-title'); + element.setAttribute('data-original-title', msg); + $(element).tooltip('show'); + element.setAttribute('data-original-title', tooltipOriginalTitle); + } + + if(ClipboardJS.isSupported()) { + $(document).ready(function() { + var copyButton = ""; + + $(".examples, div.sourceCode").addClass("hasCopyButton"); + + // Insert copy buttons: + $(copyButton).prependTo(".hasCopyButton"); + + // Initialize tooltips: + $('.btn-copy-ex').tooltip({container: 'body'}); + + // Initialize clipboard: + var clipboardBtnCopies = new ClipboardJS('[data-clipboard-copy]', { + text: function(trigger) { + return trigger.parentNode.textContent; + } + }); + + clipboardBtnCopies.on('success', function(e) { + changeTooltipMessage(e.trigger, 'Copied!'); + e.clearSelection(); + }); + + clipboardBtnCopies.on('error', function() { + changeTooltipMessage(e.trigger,'Press Ctrl+C or Command+C to copy'); + }); + }); + } +})(window.jQuery || window.$) diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml new file mode 100644 index 0000000..06aaa82 --- /dev/null +++ b/docs/pkgdown.yml @@ -0,0 +1,7 @@ +pandoc: 2.11.4 +pkgdown: 1.6.1 +pkgdown_sha: ~ +articles: + MultiEWCE: MultiEWCE.html +last_built: 2021-11-10T11:38Z + diff --git a/docs/reference/RDA_assign_load.html b/docs/reference/RDA_assign_load.html new file mode 100644 index 0000000..7916aaf --- /dev/null +++ b/docs/reference/RDA_assign_load.html @@ -0,0 +1,172 @@ + + + + + + + + +Load RDA file and assign to specific variable +Can be useful, but sort of pointless now as we have decided to only use .rds — RDA_assign_load • MultiEWCE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    + +
    +
    + + +
    +

    Load RDA file and assign to specific variable +Can be useful, but sort of pointless now as we have decided to only use .rds

    +
    + +
    RDA_assign_load(file)
    + +

    Arguments

    + + + + + + +
    file

    file path to rda <string>

    + +

    Value

    + +

    the data contained in the .rda file

    + +

    Examples

    +
    +if (FALSE) { +files = "results.rds" +RDA_assign_load(file)} + +
    +
    + +
    + + +
    + + +
    +

    Site built with pkgdown 1.6.1.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/reference/Rplot001.png b/docs/reference/Rplot001.png new file mode 100644 index 0000000000000000000000000000000000000000..17a358060aed2a86950757bbd25c6f92c08c458f GIT binary patch literal 1011 zcmeAS@N?(olHy`uVBq!ia0y~yV0-|=9Be?5+AI5}0x7m6Z+90U4Fo@(ch>_c&H|6f zVg?3oArNM~bhqvg0|WD9PZ!6KiaBo&GBN^{G%5UFpXcEKVvd5*5Eu=C0SJK)8A6*F U7`aXvEC5;V>FVdQ&MBb@00SN#Z2$lO literal 0 HcmV?d00001 diff --git a/docs/reference/ewce_para.html b/docs/reference/ewce_para.html new file mode 100644 index 0000000..45168fb --- /dev/null +++ b/docs/reference/ewce_para.html @@ -0,0 +1,218 @@ + + + + + + + + +EWCE parallel — ewce_para • MultiEWCE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    + +
    +
    + + +
    +

    Runs EWCE in parallel on multiple gene lists.

    +
    + +
    ewce_para(
    +  list_names,
    +  gene_data,
    +  list_name_column = "Phenotype",
    +  gene_column = "Gene",
    +  results_directory,
    +  ctd_file,
    +  background_genes,
    +  bootstrap_reps,
    +  annotation_Level,
    +  genes_Species,
    +  ctd_Species,
    +  cores
    +)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    list_names

    character vector of gene list names

    gene_data

    data frame of gene list names and genes (see ?get_gene_list)

    list_name_column

    The name of the gene_data column that has the gene list names

    gene_column

    The name of the gene_data column that contains the genes

    results_directory

    The desired output filepath for results to be saved

    ctd_file

    The cell type data object for EWCE analysis (see EWCE docs)

    background_genes

    The background geneset for EWCE analysis (see EWCE docs)

    bootstrap_reps

    The number of bootstrap reps <int> (e.g. 100000)

    annotation_Level

    The level of desired cell resolution from the CTD

    genes_Species

    The species of gene lists <string> "human" or "mouse"

    ctd_Species

    "human" or "mouse" <string>

    cores

    The number of cores to run in parallel (e.g. 8) <int>

    + +

    Value

    + +

    True if analysis was sucessful, +saves results at "<results_directory>/<list_name>.rds"

    + +
    + +
    + + +
    + + +
    +

    Site built with pkgdown 1.6.1.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/reference/ewce_plot.html b/docs/reference/ewce_plot.html new file mode 100644 index 0000000..32a99c3 --- /dev/null +++ b/docs/reference/ewce_plot.html @@ -0,0 +1,171 @@ + + + + + + + + +Modification to ewce.plot function to automatically align the dendrogram — ewce_plot • MultiEWCE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    + +
    +
    + + +
    +

    Modification to ewce.plot function to automatically align the dendrogram

    +
    + +
    ewce_plot(total_res, mtc_method = "bonferroni", ctd = NULL)
    + +

    Arguments

    + + + + + + + + + + + + + + +
    total_res

    Results to be plotted ?

    mtc_method

    Multiple comparison adjustment method

    ctd

    Cell type data object <list>

    + +

    Value

    + +

    A bar chart with dendrogram of EWCE results in each cell type.

    + +

    Examples

    +
    if (FALSE) ewce.plot(results_dataframe,"bonferroni",CTD) +
    +
    + +
    + + +
    + + +
    +

    Site built with pkgdown 1.6.1.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/reference/gen_results.html b/docs/reference/gen_results.html new file mode 100644 index 0000000..a9027c5 --- /dev/null +++ b/docs/reference/gen_results.html @@ -0,0 +1,264 @@ + + + + + + + + +Generate results — gen_results • MultiEWCE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    + +
    +
    + + +
    +

    Generates EWCE results on multiple gene lists in parallel by calling +ewce_para. It allows you to stop the analysis and then continue later +from where you left off as it checks the results output directory for finished +gene lists and removes them from the input. It also excludes gene lists with +less than 4 unique genes (which cause errors in ewce analysis).

    +
    + +
    gen_results(
    +  ctd,
    +  gene_data,
    +  list_names,
    +  background_genes,
    +  list_name_column = "Phenotype",
    +  gene_column = "Gene",
    +  results_dir = "results",
    +  overwrite_past_analysis = FALSE,
    +  reps = 10,
    +  annotLevel = 1,
    +  genelistSpecies = "human",
    +  sctSpecies = "human",
    +  cores = 1,
    +  MergeResults = TRUE
    +)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ctd

    The Cell type data file for EWCE analysis (see EWCE docs)

    gene_data

    The dataframe containing gene list names and associated genes +(see docs for get_gene_list for more info).

    list_names

    The names of each gene list (e.g. "Abnormality of nervous system +may be the name of a phenotype assocated gene list)

    background_genes

    A character vector of background genes (see EWCE docs)

    list_name_column

    The name of the column in gene_data that contains the +gene list names, (e.g. the column may be called "Phenotype" if dealing with +phenotype associated gene lists)

    gene_column

    The name of the column containing genes in the gene_data +dataframe. Typically this column is called "Gene"

    results_dir

    the desired direcory to save results (e.g. "results")

    overwrite_past_analysis

    overwrite previous results in the results dir <bool>

    reps

    The number of bootstrap reps for EWCE (see ewce docs) <int>

    annotLevel

    The level of cell specificity to select from the CTD, +See EWCE docs <int>

    genelistSpecies

    The species ("human"/"mouse") of the gene lists <string>

    sctSpecies

    The species ("human"/"mouse") of the CTD data

    cores

    The number of cores to run in parallel <int>

    MergeResults

    Save all results merged to single data.frame as a .rds. +Note: The function will return merged dataframe even if FALSE <bool>

    + +

    Value

    + +

    If MergeResults == TRUE, it will return all results as a datframe. If +FALSE nothing will be returned, but the individual results will still be saved +in the results directory.

    +

    Details

    + +

    The gene_data should be a data frame that contains a column of gene +list names (e.g. the column may be called "Phenotype"), and a column of +genes (e.g. "Gene"). For example:

    + + + + + + +
    PhenotypeGene
    "Abnormal heart"gene X
    "Abnormal heart"gene Y
    "Poor vision"gene Z
    "Poor vision"gene Y
    etc...
    + + + +

    For more information on this see docs for get_gene_list (?get_gene_list)

    +

    If MergeResutls == TURE, the function will return a dataframe of all results. +No multiple testing corrections are applied to this so it is recommended that +they are done after, for example: +all_results$q <- stats::p.adjust(all_results$p, method = "BH")

    + +
    + +
    + + +
    + + +
    +

    Site built with pkgdown 1.6.1.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/reference/get_gene_list.html b/docs/reference/get_gene_list.html new file mode 100644 index 0000000..18902ee --- /dev/null +++ b/docs/reference/get_gene_list.html @@ -0,0 +1,210 @@ + + + + + + + + +get_gene_list — get_gene_list • MultiEWCE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    + +
    +
    + + +
    +

    This returns a character vector of genes (a gene list). The gene_data should +be a data frame that contains a column of gene list names (e.g. the column +may be called "Phenotype"), and a column of genes (e.g. "Gene"). For example, +lets call the following data frame phenotype_to_genes:

    +
    + +
    get_gene_list(
    +  list_name,
    +  gene_data,
    +  list_name_column = "Phenotype",
    +  gene_column = "Gene"
    +)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + +
    list_name

    The name of the gene list of interest <string>

    gene_data

    The data frame of gene list names and associated +genes <data.frame>

    list_name_column

    The name of the column in gene_data that contains +gene list names <string>

    gene_column

    The name of the column in gene_data that contains +the genes <string>

    + +

    Value

    + +

    A charcter vector of genes associated with the selected list_name

    +

    Details

    + + + + + + + + + +
    PhenotypeGene
    "Abnormal heart"gene X
    "Abnormal heart"gene Y
    "Poor vision"gene Z
    "Poor vision"gene Y
    etc...
    + + + +

    In the example above, if we wanted to extract genes related to "Abnormal heart", +we would run the following example:

    + +

    Examples

    +
    if (FALSE) { +heart_genes <- get_gene_list(list_name = "Abnormal heart", + gene_data = phenotype_to_genes, + list_name_column = "Phenotype", + gene_column = "Gene") +} +
    +
    + +
    + + +
    + + +
    +

    Site built with pkgdown 1.6.1.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/reference/get_unfinished_list_names.html b/docs/reference/get_unfinished_list_names.html new file mode 100644 index 0000000..aecd104 --- /dev/null +++ b/docs/reference/get_unfinished_list_names.html @@ -0,0 +1,177 @@ + + + + + + + + +Get unfinished list names — get_unfinished_list_names • MultiEWCE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    + +
    +
    + + +
    +

    Gets the unfinished gene list names. It reads the file names in the results +directory and uses this to deduce which gene lists have already been analysed. +This means you can pause the analysis of multiple gene lists and it will not +re-analyse the already completed ones when you start again.

    +
    + +
    get_unfinished_list_names(list_names, results_dir)
    + +

    Arguments

    + + + + + + + + + + +
    list_names

    A char vector of gene list names

    results_dir

    The directory containing analysed results.

    + +

    Value

    + +

    A character vector of list_names that still need to be analysed.

    + +

    Examples

    +
    if (FALSE) { +list_names <- unique(data$phenotypes) +results_dir <- "output/" +get_unfinished_list_names(list_names,results_dir) +} +
    +
    + +
    + + +
    + + +
    +

    Site built with pkgdown 1.6.1.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/reference/get_valid_gene_lists.html b/docs/reference/get_valid_gene_lists.html new file mode 100644 index 0000000..23559a1 --- /dev/null +++ b/docs/reference/get_valid_gene_lists.html @@ -0,0 +1,201 @@ + + + + + + + + +get valid gene lists — get_valid_gene_lists • MultiEWCE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    + +
    +
    + + +
    +

    Gene lists for EWCE must have 4 or more genes. These genes must also be present +in the CTD file (see EWCE docs), and must be unique (occasionally a gene list +may contain the same gene repeated. This would cause an error).

    +
    + +
    get_valid_gene_lists(
    +  ctd,
    +  list_names,
    +  gene_data,
    +  list_name_column = "Phenotype",
    +  gene_column = "Gene"
    +)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + +
    ctd

    CTD (cell type data file) see EWCE docs

    list_names

    Vector of gene list names <character vector>

    gene_data

    data frame containing a gene column and a column of list_names

    list_name_column

    The name of the column that contains +gene list_names <string>

    gene_column

    The name of the gene column (e.g. "Gene") <string>

    + +

    Value

    + +

    A character vector of list_names that are associated with a valid +number of genes

    +

    Details

    + +

    This function gets gene lists that have atleast four unique genes that are also +present in the CTD file.

    + +

    Examples

    +
    if (FALSE) { +remove_invalid_gene_lists(ctd, + list_names, + gene_data, + list_names_column = "Phenotype", + gene_column = "Gene") +} +
    +
    + +
    + + +
    + + +
    +

    Site built with pkgdown 1.6.1.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/reference/index.html b/docs/reference/index.html new file mode 100644 index 0000000..84b05e6 --- /dev/null +++ b/docs/reference/index.html @@ -0,0 +1,217 @@ + + + + + + + + +Function reference • MultiEWCE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    All functions

    +

    +
    +

    ewce_para()

    +

    EWCE parallel

    +

    ewce_plot()

    +

    Modification to ewce.plot function to automatically align the dendrogram

    +

    gen_results()

    +

    Generate results

    +

    get_gene_list()

    +

    get_gene_list

    +

    get_unfinished_list_names()

    +

    Get unfinished list names

    +

    get_valid_gene_lists()

    +

    get valid gene lists

    +

    is_not_analysed()

    +

    Is not analysed?

    +

    merge_results()

    +

    merge results

    +

    RDA_assign_load()

    +

    Load RDA file and assign to specific variable +Can be useful, but sort of pointless now as we have decided to only use .rds

    +
    + + +
    + + +
    + + +
    +

    Site built with pkgdown 1.6.1.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/reference/is_not_analysed.html b/docs/reference/is_not_analysed.html new file mode 100644 index 0000000..8f05a8d --- /dev/null +++ b/docs/reference/is_not_analysed.html @@ -0,0 +1,168 @@ + + + + + + + + +Is not analysed? — is_not_analysed • MultiEWCE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    + +
    +
    + + +
    +

    Takes a gene list name and checks the output results directory to see if that +gene list has been analysed yet. The ewce_para function outputs the results +for each gene list in to the results directory with name format list_name.rds

    +
    + +
    is_not_analysed(list_name, results_dir)
    + +

    Arguments

    + + + + + + + + + + +
    list_name

    The name of a gene list e.g. "Phenotypic abnormality"

    results_dir

    The path to results directory

    + +

    Value

    + +

    True or false <bool>

    + +
    + +
    + + +
    + + +
    +

    Site built with pkgdown 1.6.1.

    +
    + +
    +
    + + + + + + + + diff --git a/docs/reference/merge_results.html b/docs/reference/merge_results.html new file mode 100644 index 0000000..2ef906b --- /dev/null +++ b/docs/reference/merge_results.html @@ -0,0 +1,166 @@ + + + + + + + + +merge results — merge_results • MultiEWCE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    + +
    +
    + + +
    +

    merges individual .rds files from the results output directory into one +dataframe.

    +
    + +
    merge_results(results_dir = "results", list_name_column = "phenotype")
    + +

    Arguments

    + + + + + + + + + + +
    results_dir

    The filepath to results .rds files

    list_name_column

    The column name for gene list_names (e.g. phenotypes)

    + +

    Value

    + +

    dataframe

    + +
    + +
    + + + +
    + + + + + + + + diff --git a/vignettes/.gitignore b/vignettes/.gitignore index 097b241..391e1bf 100644 --- a/vignettes/.gitignore +++ b/vignettes/.gitignore @@ -1,2 +1,4 @@ *.html *.R +CTD_Descartes_withplot.rds +phenotype_to_genes.txt \ No newline at end of file diff --git a/vignettes/MultiEWCE.Rmd b/vignettes/MultiEWCE.Rmd index e80e423..10797a0 100644 --- a/vignettes/MultiEWCE.Rmd +++ b/vignettes/MultiEWCE.Rmd @@ -27,15 +27,15 @@ This package is useful in cases where you have a large number of related, but se This tutorial will require the MultiEWCE package and a few additional packages related to the particular dataset we will be using. Install and load these with the following R code: ```{r install, message = FALSE, warning = FALSE, eval = FALSE} -if (!require("devtools")) { - install.packages("devtools") -} +# if (!require("devtools")) { +# install.packages("devtools") +# } if (!require("HPOExplorer")) { devtools::install_github("ovrhuman/HPOExplorer") } -if (!require("MultiEWCE")) { - devtools::install_github("ovrhuman/MultiEWCE") -} +#if (!require("MultiEWCE")) { +# devtools::install_github("ovrhuman/MultiEWCE") +#} ``` # Loading Phenotype Associated Gene Lists from the HPO @@ -55,7 +55,7 @@ Now we will get a dataset like this from the HPO. ```{r get_HPO_data, message = FALSE, warning = FALSE, eval = FALSE} # Download phenotype associated gene data -HPOExplorer::download_phenotype_to_genes("phenotype_to_genes.txt") +#HPOExplorer::download_phenotype_to_genes("phenotype_to_genes.txt") # Load data into the environment gene_data <- HPOExplorer::load_phenotype_to_genes("phenotype_to_genes.txt") @@ -118,8 +118,8 @@ The `gen_results` function calls the EWCE `bootstrap_enrichment_test` function. # Run analysis Now we have set up all our desired inputs, we can run the analysis. -```{r run, warning = FALSE, message = FALSE, eval = FALSE} -all_results <- gen_results(ctd, +```{r run, warning = FALSE, message = FALSE, eval = FALSE} +all_results <-MultiEWCE::gen_results(ctd, gene_data, list_names, background_genes, @@ -177,7 +177,7 @@ print(plot1) If you have a results directory of individual EWCE results but do not have the merged dataframe of all results, you can call the `merge_results` function manually. The `results_dir` argument is the path to your results directory and the `list_name_column` argument is the name of the column containing gene list names. In this case we used "Phenotype" as this column name when we generated the results. ```{r merge, eval = FALSE} -all_results_2 <- merge_results(results_dir = "results", +all_results_2 <- MultiEWCE::merge_results(results_dir = "results", list_name_column = "Phenotype") ``` @@ -197,7 +197,7 @@ cat(paste("5 genes associated with poor eye contact:",paste(eye_contact_genes[1: This function is used to find which gene lists you have not yet analysed ```{r get_unfinished, eval = FALSE} -unfinished <- get_unfinished_list_names(list_names = unique(gene_data$Phenotype)[1:15], +unfinished <- MultiEWCE::get_unfinished_list_names(list_names = unique(gene_data$Phenotype)[1:15], results_dir = "results") cat(paste0("Gene lists not yet analysed:\n",paste(unfinished, collapse = ",\n"))) ```