diff --git a/R/app.R b/R/app.R
index 57ae69a..bc430b5 100644
--- a/R/app.R
+++ b/R/app.R
@@ -5,5 +5,5 @@
#'
#' @export
run_app <- function(host = "127.0.0.1", port = 3464) {
- runApp(shinyApp(ui, server), host = host, port = port)
+ runApp(shinyApp(ui, server), host = host, port = port)
}
diff --git a/R/server.R b/R/server.R
index ea45305..52b1db4 100644
--- a/R/server.R
+++ b/R/server.R
@@ -1,43 +1,43 @@
#' Server implementing the main user interface.
#' @noRd
server <- function(input, output) {
- ranked_data <- reactive({
- total_weight <- abs(input$above_zero) +
- abs(input$above_median) +
- abs(input$above_95) +
- abs(input$mean_expression) +
- abs(input$sd_expression)
+ ranked_data <- reactive({
+ total_weight <- abs(input$above_zero) +
+ abs(input$above_median) +
+ abs(input$above_95) +
+ abs(input$mean_expression) +
+ abs(input$sd_expression)
- data <- data.table::copy(ubigen::genes)
+ data <- data.table::copy(ubigen::genes)
- data[, score :=
- (input$above_zero * above_zero +
- input$above_95 * above_95 +
- input$above_median * above_median +
- input$mean_expression * mean_expression_normalized +
- input$sd_expression * sd_expression_normalized) /
- total_weight]
+ data[, score :=
+ (input$above_zero * above_zero +
+ input$above_95 * above_95 +
+ input$above_median * above_median +
+ input$mean_expression * mean_expression_normalized +
+ input$sd_expression * sd_expression_normalized) /
+ total_weight]
- data.table::setorder(data, -score)
- data[, rank := .I]
- data[, percentile := 1 - rank / max(rank)]
+ data.table::setorder(data, -score)
+ data[, rank := .I]
+ data[, percentile := 1 - rank / max(rank)]
- data
- })
+ data
+ })
- output$scores_plot <- plotly::renderPlotly(scores_plot(ranked_data()))
+ output$scores_plot <- plotly::renderPlotly(scores_plot(ranked_data()))
- output$selected_genes <- DT::renderDataTable({
- selected_points <- plotly::event_data("plotly_selected")
+ output$selected_genes <- DT::renderDataTable({
+ selected_points <- plotly::event_data("plotly_selected")
- data <- if (is.null(selected_points)) {
- ranked_data()
- } else {
- ranked_data()[rank %in% selected_points$x]
- }
+ data <- if (is.null(selected_points)) {
+ ranked_data()
+ } else {
+ ranked_data()[rank %in% selected_points$x]
+ }
- genes_table(data)
- })
+ genes_table(data)
+ })
}
#' Create plot showing the distribution of scores using `plotly`.
@@ -49,95 +49,95 @@ server <- function(input, output) {
#' @return A `plotly` figure for rendering.
#' @noRd
scores_plot <- function(ranked_data, ranks = 1000) {
- data <- if (is.null(ranks)) {
- ranked_data
- } else {
- ranked_data[1:ranks]
- }
+ data <- if (is.null(ranks)) {
+ ranked_data
+ } else {
+ ranked_data[1:ranks]
+ }
- ranks_label <- if (is.null(ranks)) {
- "Ranks"
- } else {
- glue::glue("Ranks (1 to {ranks})")
- }
+ ranks_label <- if (is.null(ranks)) {
+ "Ranks"
+ } else {
+ glue::glue("Ranks (1 to {ranks})")
+ }
- plotly::plot_ly() |>
- plotly::add_markers(
- data = data,
- x = ~rank,
- y = ~score,
- text = ~hgnc_name,
- customdata = ~percentile,
- hovertemplate = paste0(
- "%{text}
",
- "Rank: %{x}
",
- "Score: %{y:.2}
",
- "Percentile: %{customdata:.2%}",
- ""
- )
- ) |>
- plotly::layout(
- xaxis = list(title = ranks_label),
- yaxis = list(title = "Score"),
- clickmode = "event+select",
- dragmode = "select"
- )
+ plotly::plot_ly() |>
+ plotly::add_markers(
+ data = data,
+ x = ~rank,
+ y = ~score,
+ text = ~hgnc_name,
+ customdata = ~percentile,
+ hovertemplate = paste0(
+ "%{text}
",
+ "Rank: %{x}
",
+ "Score: %{y:.2}
",
+ "Percentile: %{customdata:.2%}",
+ ""
+ )
+ ) |>
+ plotly::layout(
+ xaxis = list(title = ranks_label),
+ yaxis = list(title = "Score"),
+ clickmode = "event+select",
+ dragmode = "select"
+ )
}
#' Create a displayable data table from the gene results data.
#' @noRd
genes_table <- function(data) {
- data <- data[, .(
- "Gene" = glue::glue_data(
- data,
- "{hgnc_name}"
- ),
- "Rank" = rank,
- "Percentile" = percentile,
- "Score" = score,
- "Median" = median_expression,
- "Mean" = mean_expression,
- "Standard deviation" = sd_expression,
- "Expressed" = above_zero,
- "Above median" = above_median,
- "Above 95%" = above_95
- )]
+ data <- data[, .(
+ "Gene" = glue::glue_data(
+ data,
+ "{hgnc_name}"
+ ),
+ "Rank" = rank,
+ "Percentile" = percentile,
+ "Score" = score,
+ "Median" = median_expression,
+ "Mean" = mean_expression,
+ "Standard deviation" = sd_expression,
+ "Expressed" = above_zero,
+ "Above median" = above_median,
+ "Above 95%" = above_95
+ )]
- DT::datatable(
- data,
- options = list(
- buttons = list(
- list(
- extend = "copy",
- text = "Copy to clipboard"
- ),
- list(
- extend = "csv",
- text = "Download CSV"
- )
- ),
- dom = "fBrtip",
- pageLength = 100
+ DT::datatable(
+ data,
+ options = list(
+ buttons = list(
+ list(
+ extend = "copy",
+ text = "Copy to clipboard"
),
- rownames = FALSE,
- escape = FALSE,
- selection = "none",
- extensions = "Buttons"
+ list(
+ extend = "csv",
+ text = "Download CSV"
+ )
+ ),
+ dom = "fBrtip",
+ pageLength = 100
+ ),
+ rownames = FALSE,
+ escape = FALSE,
+ selection = "none",
+ extensions = "Buttons"
+ ) |>
+ DT::formatPercentage(
+ c(
+ "Percentile",
+ "Score",
+ "Expressed",
+ "Above median",
+ "Above 95%"
+ ),
+ digits = 2,
) |>
- DT::formatPercentage(
- c(
- "Percentile",
- "Score",
- "Expressed",
- "Above median",
- "Above 95%"
- ),
- digits = 2,
- ) |>
- DT::formatRound(c(
- "Median",
- "Mean",
- "Standard deviation"
- ))
+ DT::formatRound(c(
+ "Median",
+ "Mean",
+ "Standard deviation"
+ ))
}
diff --git a/R/ui.R b/R/ui.R
index 1f6666e..e562f53 100644
--- a/R/ui.R
+++ b/R/ui.R
@@ -1,115 +1,115 @@
#' Function for creating the main user interface.
#' @noRd
ui <- function() {
- navbarPage(
- theme = bslib::bs_theme(
- version = 5,
- bootswatch = "united",
- primary = "#7d19bf"
+ navbarPage(
+ theme = bslib::bs_theme(
+ version = 5,
+ bootswatch = "united",
+ primary = "#7d19bf"
+ ),
+ title = "Ubigen",
+ tabPanel(
+ "Explore",
+ sidebarLayout(
+ sidebarPanel(
+ width = 3,
+ h3("Features"),
+ sliderInput(
+ "above_zero",
+ verticalLayout(
+ strong("Expressed"),
+ paste0(
+ "Percentage of samples in which the gene is ",
+ "expressed."
+ )
+ ),
+ min = -1.0,
+ max = 1.0,
+ step = 0.01,
+ value = 0.33
+ ),
+ sliderInput(
+ "above_median",
+ verticalLayout(
+ strong("Expressed above median"),
+ paste0(
+ "Percentage of samples that express the gene ",
+ "more than the median of expression within ",
+ "that sample."
+ )
+ ),
+ min = -1.0,
+ max = 1.0,
+ step = 0.01,
+ value = 0.33
+ ),
+ sliderInput(
+ "above_95",
+ verticalLayout(
+ strong("Expressed above 95%"),
+ paste0(
+ "Percentage of samples that express the gene ",
+ "more than the 95. percentile of expression ",
+ "within that sample."
+ )
+ ),
+ min = -1.0,
+ max = 1.0,
+ step = 0.01,
+ value = 0.33
+ ),
+ sliderInput(
+ "mean_expression",
+ verticalLayout(
+ strong("Mean expression"),
+ div(paste0(
+ "Average of the gene's expression across all ",
+ "samples."
+ ))
+ ),
+ min = -1.0,
+ max = 1.0,
+ step = 0.01,
+ value = 1.0
+ ),
+ sliderInput(
+ "sd_expression",
+ verticalLayout(
+ strong("Standard deviation"),
+ paste0(
+ "Standard deviation of the gene's expression ",
+ "across all samples."
+ )
+ ),
+ min = -1.0,
+ max = 1.0,
+ step = 0.01,
+ value = -1.0
+ )
),
- title = "Ubigen",
- tabPanel(
- "Explore",
- sidebarLayout(
- sidebarPanel(
- width = 3,
- h3("Features"),
- sliderInput(
- "above_zero",
- verticalLayout(
- strong("Expressed"),
- paste0(
- "Percentage of samples in which the gene is ",
- "expressed."
- )
- ),
- min = -1.0,
- max = 1.0,
- step = 0.01,
- value = 0.33
- ),
- sliderInput(
- "above_median",
- verticalLayout(
- strong("Expressed above median"),
- paste0(
- "Percentage of samples that express the gene ",
- "more than the median of expression within ",
- "that sample."
- )
- ),
- min = -1.0,
- max = 1.0,
- step = 0.01,
- value = 0.33
- ),
- sliderInput(
- "above_95",
- verticalLayout(
- strong("Expressed above 95%"),
- paste0(
- "Percentage of samples that express the gene ",
- "more than the 95. percentile of expression ",
- "within that sample."
- )
- ),
- min = -1.0,
- max = 1.0,
- step = 0.01,
- value = 0.33
- ),
- sliderInput(
- "mean_expression",
- verticalLayout(
- strong("Mean expression"),
- div(paste0(
- "Average of the gene's expression across all ",
- "samples."
- ))
- ),
- min = -1.0,
- max = 1.0,
- step = 0.01,
- value = 1.0
- ),
- sliderInput(
- "sd_expression",
- verticalLayout(
- strong("Standard deviation"),
- paste0(
- "Standard deviation of the gene's expression ",
- "across all samples."
- )
- ),
- min = -1.0,
- max = 1.0,
- step = 0.01,
- value = -1.0
- )
- ),
- mainPanel(
- width = 9,
- h3("Distribution of scores"),
- div(paste0(
- "Click or drag within the figure to select genes of ",
- "interest."
- )),
- plotly::plotlyOutput("scores_plot"),
- h3("Detailed ranking"),
- div(paste0(
- "Click on gene names to view them using the Ensembl ",
- "genome browser."
- )),
- div(class = "p-1"),
- DT::dataTableOutput("selected_genes")
- )
- )
- ),
- tabPanel(
- title = "Help"
- ),
- tabPanel(
- title = "Publication"
+ mainPanel(
+ width = 9,
+ h3("Distribution of scores"),
+ div(paste0(
+ "Click or drag within the figure to select genes of ",
+ "interest."
+ )),
+ plotly::plotlyOutput("scores_plot"),
+ h3("Detailed ranking"),
+ div(paste0(
+ "Click on gene names to view them using the Ensembl ",
+ "genome browser."
+ )),
+ div(class = "p-1"),
+ DT::dataTableOutput("selected_genes")
)
+ )
+ ),
+ tabPanel(
+ title = "Help"
+ ),
+ tabPanel(
+ title = "Publication"
)
+ )
}