From 4a9750436553665d760deabd01bafb69eef35709 Mon Sep 17 00:00:00 2001 From: asizemore Date: Tue, 17 Sep 2024 13:52:01 +0000 Subject: [PATCH 1/5] working draft for beta div --- .gitignore | 3 +++ R/utils-markdown.R | 63 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 R/utils-markdown.R diff --git a/.gitignore b/.gitignore index 6c949a1..2b77f4b 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,6 @@ po/*~ rsconnect/ docs inst/doc + +# Mac things +.DS_Store diff --git a/R/utils-markdown.R b/R/utils-markdown.R new file mode 100644 index 0000000..49d8c05 --- /dev/null +++ b/R/utils-markdown.R @@ -0,0 +1,63 @@ +# Helper functions for creating the R Markdown files. + +createRMarkdownFromComputeResult <- function(data, color){ + + df <- getComputeResult(data) + axis1_name <- data@computedVariableMetadata[[1]]@displayName + axis2_name <- data@computedVariableMetadata[[2]]@displayName + p <- ggplot2::ggplot(df) + + aes(x=Axis1, y=Axis2) + + geom_point() + + labs(y= axis2_name, x =axis1_name, + title="Beta diversity by body site", + caption=paste0("produced on ", Sys.time())) + + theme_bw() + + cat("--- +title: \"Beta Diversity Output Rmd\" +output: html_document +--- + +\`\`\`{r setup, include=FALSE} +knitr::opts_chunk$set(echo = TRUE) +\`\`\` + +## Examine the ComputationResult object +The `ComputationResult` object contains useful information about the results. +\`\`\`{r results, echo=TRUE} +# A few helpful slots in the ComputationResult object + +# Input parameters of the computation +print(data@parameters) + +# The computed variable display names include the percent variance captured by each axis. +print(paste0(data@computedVariableMetadata[[1]]@displayName, ', ', data@computedVariableMetadata[[2]]@displayName)) +\`\`\` + +## Inspect the returned data +\`\`\`{r example_data, echo=TRUE} +df <- getComputeResult(data) +head(df) +\`\`\` + +## Example plot +\`\`\`{r example_plot, echo=TRUE} + + axis1_name <- data@computedVariableMetadata[[1]]@displayName + axis2_name <- data@computedVariableMetadata[[2]]@displayName + p <- ggplot2::ggplot(df) + + aes(x=Axis1, y=Axis2) + + geom_point() + + labs(y= axis2_name, x = axis1_name, + title='Beta diversity PCoA plot', + caption=paste0('produced on ', Sys.time())) + + theme_bw() + p +\`\`\`", +file = "tmp.Rmd") + rmarkdown::render("tmp.Rmd") + + mylist <- list(plot = p, df = df) + return(mylist) + +} From 7046752c2694f5d0ace45f56ba9f6430f176833f Mon Sep 17 00:00:00 2001 From: asizemore Date: Tue, 17 Sep 2024 14:43:26 +0000 Subject: [PATCH 2/5] add beta div template --- R/utils-markdown.R | 49 ++----------------- .../beta_div_mkdn/skeleton/skeleton.Rmd | 41 ++++++++++++++++ .../templates/beta_div_mkdn/template.yaml | 3 ++ 3 files changed, 49 insertions(+), 44 deletions(-) create mode 100644 inst/rmarkdown/templates/beta_div_mkdn/skeleton/skeleton.Rmd create mode 100644 inst/rmarkdown/templates/beta_div_mkdn/template.yaml diff --git a/R/utils-markdown.R b/R/utils-markdown.R index 49d8c05..c6ea8f1 100644 --- a/R/utils-markdown.R +++ b/R/utils-markdown.R @@ -1,6 +1,7 @@ # Helper functions for creating the R Markdown files. -createRMarkdownFromComputeResult <- function(data, color){ + +createRMarkdownFromComputeResult <- function(data, rmd_file_name = "tmp.Rmd"){ df <- getComputeResult(data) axis1_name <- data@computedVariableMetadata[[1]]@displayName @@ -13,49 +14,9 @@ createRMarkdownFromComputeResult <- function(data, color){ caption=paste0("produced on ", Sys.time())) + theme_bw() - cat("--- -title: \"Beta Diversity Output Rmd\" -output: html_document ---- - -\`\`\`{r setup, include=FALSE} -knitr::opts_chunk$set(echo = TRUE) -\`\`\` - -## Examine the ComputationResult object -The `ComputationResult` object contains useful information about the results. -\`\`\`{r results, echo=TRUE} -# A few helpful slots in the ComputationResult object - -# Input parameters of the computation -print(data@parameters) - -# The computed variable display names include the percent variance captured by each axis. -print(paste0(data@computedVariableMetadata[[1]]@displayName, ', ', data@computedVariableMetadata[[2]]@displayName)) -\`\`\` - -## Inspect the returned data -\`\`\`{r example_data, echo=TRUE} -df <- getComputeResult(data) -head(df) -\`\`\` - -## Example plot -\`\`\`{r example_plot, echo=TRUE} - - axis1_name <- data@computedVariableMetadata[[1]]@displayName - axis2_name <- data@computedVariableMetadata[[2]]@displayName - p <- ggplot2::ggplot(df) + - aes(x=Axis1, y=Axis2) + - geom_point() + - labs(y= axis2_name, x = axis1_name, - title='Beta diversity PCoA plot', - caption=paste0('produced on ', Sys.time())) + - theme_bw() - p -\`\`\`", -file = "tmp.Rmd") - rmarkdown::render("tmp.Rmd") + template <- "inst/rmarkdown/templates/beta_div_mkdn/skeleton/skeleton.Rmd" + file.copy(template, rmd_file_name, overwrite = TRUE) + rmarkdown::render(rmd_file_name) mylist <- list(plot = p, df = df) return(mylist) diff --git a/inst/rmarkdown/templates/beta_div_mkdn/skeleton/skeleton.Rmd b/inst/rmarkdown/templates/beta_div_mkdn/skeleton/skeleton.Rmd new file mode 100644 index 0000000..55e4052 --- /dev/null +++ b/inst/rmarkdown/templates/beta_div_mkdn/skeleton/skeleton.Rmd @@ -0,0 +1,41 @@ +--- +title: "Beta Diversity Output Rmd" +output: html_document +--- + +```{r setup, include=FALSE} +knitr::opts_chunk$set(echo = TRUE) +``` + +## Examine the ComputationResult object +The `ComputationResult` object contains useful information about the results. +```{r results, echo=TRUE} +# A few helpful slots in the ComputationResult object + +# Input parameters of the computation +print(data@parameters) + +# The computed variable display names include the percent variance captured by each axis. +print(paste0(data@computedVariableMetadata[[1]]@displayName, ', ', data@computedVariableMetadata[[2]]@displayName)) +``` + +## Inspect the returned data +```{r example_data, echo=TRUE} +df <- getComputeResult(data) +head(df) +``` + +## Example plot +```{r example_plot, echo=TRUE} + + axis1_name <- data@computedVariableMetadata[[1]]@displayName + axis2_name <- data@computedVariableMetadata[[2]]@displayName + p <- ggplot2::ggplot(df) + + aes(x=Axis1, y=Axis2) + + geom_point() + + labs(y= axis2_name, x = axis1_name, + title='Beta diversity PCoA plot', + caption=paste0('produced on ', Sys.time())) + + theme_bw() + p +``` \ No newline at end of file diff --git a/inst/rmarkdown/templates/beta_div_mkdn/template.yaml b/inst/rmarkdown/templates/beta_div_mkdn/template.yaml new file mode 100644 index 0000000..caa3fa7 --- /dev/null +++ b/inst/rmarkdown/templates/beta_div_mkdn/template.yaml @@ -0,0 +1,3 @@ +name: "beta_div_mkdn" +description: "Beta Diversity Output Rmd Template" +create_dir: true \ No newline at end of file From a6b2508ed1ff13978493e60be5310824c98b7bcd Mon Sep 17 00:00:00 2001 From: asizemore Date: Tue, 17 Sep 2024 21:44:06 +0000 Subject: [PATCH 3/5] created custom template --- NAMESPACE | 1 + R/utils-markdown.R | 76 ++++++++++++++---- .../resources/MicrobiomeDB_hex_final.png | Bin 0 -> 76546 bytes inst/rmarkdown/resources/styles.css | 21 +++++ .../beta_div_mkdn/skeleton/skeleton.Rmd | 41 +++++----- .../templates/beta_div_mkdn/template.yaml | 2 +- man/createRMarkdownFromComputeResult.Rd | 27 +++++++ man/mbiodb_html_format.Rd | 16 ++++ 8 files changed, 149 insertions(+), 35 deletions(-) create mode 100644 inst/rmarkdown/resources/MicrobiomeDB_hex_final.png create mode 100644 inst/rmarkdown/resources/styles.css create mode 100644 man/createRMarkdownFromComputeResult.Rd create mode 100644 man/mbiodb_html_format.Rd diff --git a/NAMESPACE b/NAMESPACE index b85fde1..366915e 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -21,6 +21,7 @@ export(importPhyloseq) export(importQIIME2) export(importTreeSE) export(importTreeSummarizedExperiment) +export(mbiodb_html_format) export(rankedAbundance) export(selfCorrelation) export(updateCollectionName) diff --git a/R/utils-markdown.R b/R/utils-markdown.R index c6ea8f1..131212a 100644 --- a/R/utils-markdown.R +++ b/R/utils-markdown.R @@ -1,24 +1,70 @@ # Helper functions for creating the R Markdown files. +#' Create R Markdown file from compute result +#' This function will create an R Markdown file that from a ComputeResult object. The markdown +#' file will describe how to access the data in the ComputeResult object and create a plot. Finally, +#' it will render the R Markdown file to HTML. Templates for these mardown files are stored in the +#' inst/rmarkdown/templates directory. +#' @param result A compute result object +#' @param rmd_file_name The name of the R Markdown file to be created. Default is 'tmp.Rmd' +#' @return A list containing the plots created for the R markdown file. +createRMarkdownFromComputeResult <- function(result, rmd_file_name = "tmp.Rmd"){ -createRMarkdownFromComputeResult <- function(data, rmd_file_name = "tmp.Rmd"){ - - df <- getComputeResult(data) - axis1_name <- data@computedVariableMetadata[[1]]@displayName - axis2_name <- data@computedVariableMetadata[[2]]@displayName - p <- ggplot2::ggplot(df) + - aes(x=Axis1, y=Axis2) + - geom_point() + - labs(y= axis2_name, x =axis1_name, - title="Beta diversity by body site", - caption=paste0("produced on ", Sys.time())) + - theme_bw() - - template <- "inst/rmarkdown/templates/beta_div_mkdn/skeleton/skeleton.Rmd" + dt <- getComputeResult(result) + + if (result@name == 'betaDiv') { + # We'll create a pcoa scatterplot + axis1_name <- result@computedVariableMetadata[[1]]@displayName + axis2_name <- result@computedVariableMetadata[[2]]@displayName + p <- ggplot2::ggplot(dt) + + aes(x=Axis1, y=Axis2) + + geom_point() + + labs(y= axis2_name, x =axis1_name, + title="Beta diversity by body site", + caption=paste0("produced on ", Sys.time())) + + theme_bw() + + template <- "inst/rmarkdown/templates/beta_div_mkdn/skeleton/skeleton.Rmd" + mylist <- list(plot = p) + } else { + stop(paste0("This function does not support ComputeResult objects with name=", data@name)) + } + + # Create the R Markdown file file.copy(template, rmd_file_name, overwrite = TRUE) rmarkdown::render(rmd_file_name) - mylist <- list(plot = p, df = df) return(mylist) } + + +#' Custom HTML template, based on the custom +#' +#' Loads additional style and template file +#' +#' @param toc should a table of contents be displayed? +#' @param ... additional arguments provided to \@code{html_document} +#' @export +#' +mbiodb_html_format = function(toc = TRUE, ...) { + + # locations of resource files in the package + pkg_resource = function(...) { + system.file(..., package = "MicrobiomeDB") + } + + css = pkg_resource("rmarkdown/resources/styles.css") + + # call the base html_document function + rmarkdown::html_document( + toc = toc, + toc_float = TRUE, + fig_width = 6.5, + fig_height = 4, + theme = "lumen", + df_print = "kable", + number_sections = TRUE, + ... + ) +} diff --git a/inst/rmarkdown/resources/MicrobiomeDB_hex_final.png b/inst/rmarkdown/resources/MicrobiomeDB_hex_final.png new file mode 100644 index 0000000000000000000000000000000000000000..76f5d7d07ca29d1fbe4b52f2d410a537574b64e0 GIT binary patch literal 76546 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 literal 0 HcmV?d00001 diff --git a/inst/rmarkdown/resources/styles.css b/inst/rmarkdown/resources/styles.css new file mode 100644 index 0000000..c32188c --- /dev/null +++ b/inst/rmarkdown/resources/styles.css @@ -0,0 +1,21 @@ +.flat-table { + display: block; + font-family: sans-serif; + -webkit-font-smoothing: antialiased; + font-size: 115%; + overflow: auto; + width: auto; +} + th { + background-color: #75AADB; + color: white; + font-weight: normal; + padding: 20px 30px; + text-align: center; + } + td { + background-color: rgb(238, 238, 238); + font-color: #4D4D4D; + color: rgb(111, 111, 111); + padding: 20px 30px; + } \ No newline at end of file diff --git a/inst/rmarkdown/templates/beta_div_mkdn/skeleton/skeleton.Rmd b/inst/rmarkdown/templates/beta_div_mkdn/skeleton/skeleton.Rmd index 55e4052..7ce94ff 100644 --- a/inst/rmarkdown/templates/beta_div_mkdn/skeleton/skeleton.Rmd +++ b/inst/rmarkdown/templates/beta_div_mkdn/skeleton/skeleton.Rmd @@ -1,41 +1,44 @@ --- title: "Beta Diversity Output Rmd" -output: html_document +output: MicrobiomeDB:::mbiodb_html_format --- + + ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) ``` ## Examine the ComputationResult object -The `ComputationResult` object contains useful information about the results. -```{r results, echo=TRUE} -# A few helpful slots in the ComputationResult object - +The `ComputationResult` object contains useful information about the the beta diversity calculation. +```{r computation_result, echo=TRUE} # Input parameters of the computation -print(data@parameters) +print(result@parameters) # The computed variable display names include the percent variance captured by each axis. -print(paste0(data@computedVariableMetadata[[1]]@displayName, ', ', data@computedVariableMetadata[[2]]@displayName)) +print(paste0(result@computedVariableMetadata[[1]]@displayName, ', ', result@computedVariableMetadata[[2]]@displayName)) ``` ## Inspect the returned data ```{r example_data, echo=TRUE} -df <- getComputeResult(data) -head(df) +# Extract the output of the beta diversity computation +dt <- getComputeResult(result, format='data.table') +head(dt) ``` ## Example plot ```{r example_plot, echo=TRUE} +# Grab nice names for the axes +axis1_name <- result@computedVariableMetadata[[1]]@displayName +axis2_name <- result@computedVariableMetadata[[2]]@displayName - axis1_name <- data@computedVariableMetadata[[1]]@displayName - axis2_name <- data@computedVariableMetadata[[2]]@displayName - p <- ggplot2::ggplot(df) + - aes(x=Axis1, y=Axis2) + - geom_point() + - labs(y= axis2_name, x = axis1_name, - title='Beta diversity PCoA plot', - caption=paste0('produced on ', Sys.time())) + - theme_bw() - p +# Create the PCoA scatterplot +p <- ggplot2::ggplot(dt) + + aes(x=Axis1, y=Axis2) + + geom_point() + + labs(y= axis2_name, x = axis1_name, + title='Beta diversity PCoA plot', + caption=paste0('produced on ', Sys.time())) + + theme_bw() +p ``` \ No newline at end of file diff --git a/inst/rmarkdown/templates/beta_div_mkdn/template.yaml b/inst/rmarkdown/templates/beta_div_mkdn/template.yaml index caa3fa7..4c465f9 100644 --- a/inst/rmarkdown/templates/beta_div_mkdn/template.yaml +++ b/inst/rmarkdown/templates/beta_div_mkdn/template.yaml @@ -1,3 +1,3 @@ name: "beta_div_mkdn" description: "Beta Diversity Output Rmd Template" -create_dir: true \ No newline at end of file +create_dir: false \ No newline at end of file diff --git a/man/createRMarkdownFromComputeResult.Rd b/man/createRMarkdownFromComputeResult.Rd new file mode 100644 index 0000000..6eb2f27 --- /dev/null +++ b/man/createRMarkdownFromComputeResult.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils-markdown.R +\name{createRMarkdownFromComputeResult} +\alias{createRMarkdownFromComputeResult} +\title{Create R Markdown file from compute result +This function will create an R Markdown file that from a ComputeResult object. The markdown +file will describe how to access the data in the ComputeResult object and create a plot. Finally, +it will render the R Markdown file to HTML. Templates for these mardown files are stored in the +inst/rmarkdown/templates directory.} +\usage{ +createRMarkdownFromComputeResult(result, rmd_file_name = "tmp.Rmd") +} +\arguments{ +\item{result}{A compute result object} + +\item{rmd_file_name}{The name of the R Markdown file to be created. Default is 'tmp.Rmd'} +} +\value{ +A list containing the plots created for the R markdown file. +} +\description{ +Create R Markdown file from compute result +This function will create an R Markdown file that from a ComputeResult object. The markdown +file will describe how to access the data in the ComputeResult object and create a plot. Finally, +it will render the R Markdown file to HTML. Templates for these mardown files are stored in the +inst/rmarkdown/templates directory. +} diff --git a/man/mbiodb_html_format.Rd b/man/mbiodb_html_format.Rd new file mode 100644 index 0000000..e7bb0e5 --- /dev/null +++ b/man/mbiodb_html_format.Rd @@ -0,0 +1,16 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils-markdown.R +\name{mbiodb_html_format} +\alias{mbiodb_html_format} +\title{Custom HTML template, based on the custom} +\usage{ +mbiodb_html_format(toc = TRUE, ...) +} +\arguments{ +\item{toc}{should a table of contents be displayed?} + +\item{...}{additional arguments provided to \@code{html_document}} +} +\description{ +Loads additional style and template file +} From 063c0d6294b0dbc3406bd9068fc03df72d6ec421 Mon Sep 17 00:00:00 2001 From: asizemore Date: Tue, 17 Sep 2024 22:37:36 +0000 Subject: [PATCH 4/5] add support for alpha div --- R/utils-markdown.R | 31 ++++++++++--- .../alpha_div_mkdn/skeleton/skeleton.Rmd | 45 +++++++++++++++++++ .../templates/alpha_div_mkdn/template.yaml | 3 ++ 3 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 inst/rmarkdown/templates/alpha_div_mkdn/skeleton/skeleton.Rmd create mode 100644 inst/rmarkdown/templates/alpha_div_mkdn/template.yaml diff --git a/R/utils-markdown.R b/R/utils-markdown.R index 131212a..1f1d393 100644 --- a/R/utils-markdown.R +++ b/R/utils-markdown.R @@ -11,6 +11,7 @@ createRMarkdownFromComputeResult <- function(result, rmd_file_name = "tmp.Rmd"){ dt <- getComputeResult(result) + plot_list <- list() if (result@name == 'betaDiv') { # We'll create a pcoa scatterplot @@ -20,12 +21,30 @@ createRMarkdownFromComputeResult <- function(result, rmd_file_name = "tmp.Rmd"){ aes(x=Axis1, y=Axis2) + geom_point() + labs(y= axis2_name, x =axis1_name, - title="Beta diversity by body site", + title="PCoA plot of beta diversity results", caption=paste0("produced on ", Sys.time())) + theme_bw() template <- "inst/rmarkdown/templates/beta_div_mkdn/skeleton/skeleton.Rmd" - mylist <- list(plot = p) + plot_list[[1]] <- p + + } else if (result@name == 'alphaDiv') { + + # Show the distribution of alpha diversity values with a histogram + alpha_div_display_name <- result@computedVariableMetadata[[1]]@displayName + breaks <- pretty(range(dt$alphaDiversity), + n = nclass.Sturges(dt$alphaDiversity), + min.n = 1) + p <- ggplot2::ggplot(dt) + + aes(x=alphaDiversity) + + geom_histogram(breaks=breaks, color=1, fill='white') + + labs(y= "Frequency", x =alpha_div_display_name, + title="Distribution of alpha diversity values", + caption=paste0("produced on ", Sys.time())) + + theme_bw() + + template <- "inst/rmarkdown/templates/alpha_div_mkdn/skeleton/skeleton.Rmd" + plot_list[[1]] <- p } else { stop(paste0("This function does not support ComputeResult objects with name=", data@name)) } @@ -34,7 +53,7 @@ createRMarkdownFromComputeResult <- function(result, rmd_file_name = "tmp.Rmd"){ file.copy(template, rmd_file_name, overwrite = TRUE) rmarkdown::render(rmd_file_name) - return(mylist) + return(plot_list) } @@ -47,14 +66,14 @@ createRMarkdownFromComputeResult <- function(result, rmd_file_name = "tmp.Rmd"){ #' @param ... additional arguments provided to \@code{html_document} #' @export #' -mbiodb_html_format = function(toc = TRUE, ...) { +mbiodb_html_format <- function(toc = TRUE, ...) { # locations of resource files in the package - pkg_resource = function(...) { + pkg_resource <- function(...) { system.file(..., package = "MicrobiomeDB") } - css = pkg_resource("rmarkdown/resources/styles.css") + css <- pkg_resource("rmarkdown/resources/styles.css") # call the base html_document function rmarkdown::html_document( diff --git a/inst/rmarkdown/templates/alpha_div_mkdn/skeleton/skeleton.Rmd b/inst/rmarkdown/templates/alpha_div_mkdn/skeleton/skeleton.Rmd new file mode 100644 index 0000000..9c11419 --- /dev/null +++ b/inst/rmarkdown/templates/alpha_div_mkdn/skeleton/skeleton.Rmd @@ -0,0 +1,45 @@ +--- +title: "Alpha Diversity Output Rmd" +output: MicrobiomeDB:::mbiodb_html_format +--- + + + +```{r setup, include=FALSE} +knitr::opts_chunk$set(echo = TRUE) +``` + +## Examine the ComputationResult object +The `ComputationResult` object contains useful information about the the alpha diversity calculation. +```{r computation_result, echo=TRUE} +# Input parameters of the computation +print(result@parameters) + +``` + +## Inspect the returned data +```{r example_data, echo=TRUE} +# Extract the output of the alpha diversity computation +dt <- getComputeResult(result, format='data.table') +head(dt) +``` + +## Example plot +```{r example_plot, echo=TRUE} +# Grab nice names for the axes +alpha_div_display_name <- result@computedVariableMetadata[[1]]@displayName + +# Create histogram +alpha_div_display_name <- result@computedVariableMetadata[[1]]@displayName +breaks <- pretty(range(dt$alphaDiversity), + n = nclass.Sturges(dt$alphaDiversity), + min.n = 1) +p <- ggplot2::ggplot(dt) + + aes(x=alphaDiversity) + + geom_histogram(breaks=breaks, color=1, fill='white') + + labs(y= "Frequency", x =alpha_div_display_name, + title="Distribution of alpha diversity values", + caption=paste0("produced on ", Sys.time())) + + theme_bw() +p +``` \ No newline at end of file diff --git a/inst/rmarkdown/templates/alpha_div_mkdn/template.yaml b/inst/rmarkdown/templates/alpha_div_mkdn/template.yaml new file mode 100644 index 0000000..72073dd --- /dev/null +++ b/inst/rmarkdown/templates/alpha_div_mkdn/template.yaml @@ -0,0 +1,3 @@ +name: "alpha_div_mkdn" +description: "Alpha Diversity Output Rmd Template" +create_dir: true \ No newline at end of file From db20531eb3a4a390dba4553ddc8c997f015e1889 Mon Sep 17 00:00:00 2001 From: asizemore Date: Mon, 30 Sep 2024 08:49:41 -0400 Subject: [PATCH 5/5] add ranked abundance and update styles --- .gitignore | 3 + inst/rmarkdown/resources/styles.css | 25 ++------ .../skeleton/skeleton.Rmd | 64 +++++++++++++++++++ .../rankedAbundance_mkdn/template.yaml | 3 + 4 files changed, 74 insertions(+), 21 deletions(-) create mode 100644 inst/rmarkdown/templates/rankedAbundance_mkdn/skeleton/skeleton.Rmd create mode 100644 inst/rmarkdown/templates/rankedAbundance_mkdn/template.yaml diff --git a/.gitignore b/.gitignore index 2b77f4b..23c3a33 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,6 @@ inst/doc # Mac things .DS_Store + +# Temporary output files +tmp.* diff --git a/inst/rmarkdown/resources/styles.css b/inst/rmarkdown/resources/styles.css index c32188c..dcd9707 100644 --- a/inst/rmarkdown/resources/styles.css +++ b/inst/rmarkdown/resources/styles.css @@ -1,21 +1,4 @@ -.flat-table { - display: block; - font-family: sans-serif; - -webkit-font-smoothing: antialiased; - font-size: 115%; - overflow: auto; - width: auto; -} - th { - background-color: #75AADB; - color: white; - font-weight: normal; - padding: 20px 30px; - text-align: center; - } - td { - background-color: rgb(238, 238, 238); - font-color: #4D4D4D; - color: rgb(111, 111, 111); - padding: 20px 30px; - } \ No newline at end of file +.kable-table { + overflow-x: auto; + text-transform: capitalize; +} \ No newline at end of file diff --git a/inst/rmarkdown/templates/rankedAbundance_mkdn/skeleton/skeleton.Rmd b/inst/rmarkdown/templates/rankedAbundance_mkdn/skeleton/skeleton.Rmd new file mode 100644 index 0000000..33d096d --- /dev/null +++ b/inst/rmarkdown/templates/rankedAbundance_mkdn/skeleton/skeleton.Rmd @@ -0,0 +1,64 @@ +--- +title: "Ranked Abundance Output Rmd" +output: MicrobiomeDB:::mbiodb_html_format +--- + + + +```{r setup, include=FALSE} +knitr::opts_chunk$set(echo = TRUE) +``` + +## Examine the ComputationResult object +The `ComputationResult` object contains useful information about the ranked Abundance calculation. +```{r computation_result, echo=TRUE} +# Input parameters of the computation +print(result@parameters) + +# The rankedAbundance function will return only the top n (default n=10) most abundant taxa (pathways, etc.), +# while ignoring any taxa with {method} = 0 (for example, if method = 'median', we ignore taxa with median = 0). +# The computationDetails slot lets us know if the rankedAbundance function had to cutoff the list of taxa at n. +print(result@computationDetails) +``` + +## Inspect the returned data +```{r example_data, echo=TRUE} +# Extract the output of the ranked abundance computation +dt <- getComputeResult(result, format='data.table') +ancestorIdCols <- result@ancestorIdColumns + +# Show the names of the top taxa (pathways, etc.) by abundance +print(names(dt)[(length(ancestorIdCols)+2):ncol(dt)]) + +# Finally, check out the data +head(dt) +``` + +## Example plot +```{r example_plot, echo=TRUE, fig.height=9} + +# Create a boxplot showing the taxa with the top abundance values. +# Prep data +rankedAbund_pivot <- tidyr::pivot_longer(dt, # dataframe to be pivoted + cols = (length(result@ancestorIdColumns)+2):ncol(dt), # column names to be stored as a SINGLE variable + names_to = "taxa", # name of that new variable (column) + values_to = "abundance") # name of new variable (column) storing all the values (data) +rankedAbund_pivot$taxa <- factor(rankedAbund_pivot$taxa, levels = names(dt)[ncol(dt):(length(result@ancestorIdColumns)+2)]) +method <- gsub(".*method = ([^, ]+).*", "\\1", rabund@parameters) + +# Plot +p <- ggplot2::ggplot(rankedAbund_pivot) + + ggplot2::aes(x=taxa, y=abundance) + + ggplot2::geom_boxplot() + + ggplot2::labs(y= "Abundance", x = "Taxa", + title=paste0("Ranked abundance output, decending by ", method), + caption=paste0("produced on ", Sys.time())) + + ggplot2::coord_flip() + + ggplot2::theme_bw() +p +``` + +## Interactive plot +```{r interactive_plot, echo=TRUE, fig.height=9} +plotly::ggplotly(p) +``` \ No newline at end of file diff --git a/inst/rmarkdown/templates/rankedAbundance_mkdn/template.yaml b/inst/rmarkdown/templates/rankedAbundance_mkdn/template.yaml new file mode 100644 index 0000000..4c465f9 --- /dev/null +++ b/inst/rmarkdown/templates/rankedAbundance_mkdn/template.yaml @@ -0,0 +1,3 @@ +name: "beta_div_mkdn" +description: "Beta Diversity Output Rmd Template" +create_dir: false \ No newline at end of file