diff --git a/rank_plot.R b/rank_plot.R index efea50e..1e50f09 100644 --- a/rank_plot.R +++ b/rank_plot.R @@ -12,7 +12,11 @@ library(plotly) #' #' @param results Results to display. #' @param reference_gene_ids IDs of reference genes. -rank_plot <- function(results, reference_gene_ids) { +#' @param cutoff Cut-off score. +rank_plot <- function(results, reference_gene_ids, cutoff) { + first_not_included_rank <- results[score < cutoff, min(rank)] + last_rank <- results[, .N] + plot <- plot_ly() |> add_trace( data = results, x = ~rank, @@ -29,7 +33,16 @@ rank_plot <- function(results, reference_gene_ids) { name = ~name, width = 10, type = "bar" - ) |> layout( + ) |> layout( + shapes = list( + type = "rect", + fillcolor = "black", + opacity = 0.1, + x0 = first_not_included_rank, + x1 = last_rank, + y0 = 0.0, + y1 = 1.0 + ), xaxis = list(title = "Ranks"), yaxis = list(title = "Score") ) diff --git a/server.R b/server.R index 91ed9e8..431eb66 100644 --- a/server.R +++ b/server.R @@ -35,8 +35,8 @@ server <- function(input, output) { ) }) - #' This reactive expression applies all user defined filters as well as the - #' desired ranking weights to the results. + #' Rank the results based on the specified weights. Filter out genes with + #' too few species but don't apply the cut-off score. results <- reactive({ # Select the species preset. @@ -75,18 +75,15 @@ server <- function(input, output) { results <- results[, score := score * n_species / species_count] } - # Apply the cut-off score. - results <- results[score >= input$cutoff / 100] - # Order the results based on their score. setorder(results, -score, na.last = TRUE) results[, rank := .I] }) - output$rank_plot <- renderPlotly({ - results <- results() - rank_plot(results, genes[suggested | verified == TRUE, id]) + #' Apply the cut-off score to the ranked results. + results_filtered <- reactive({ + results()[score >= input$cutoff / 100] }) output$genes <- renderDT({ @@ -96,7 +93,7 @@ server <- function(input, output) { column_names <- c("", "Gene", "", "Chromosome", method_names, "Score") dt <- datatable( - results()[, ..columns], + results_filtered()[, ..columns], rownames = FALSE, colnames = column_names, style = "bootstrap", @@ -114,22 +111,8 @@ server <- function(input, output) { formatPercentage(dt, c(method_ids, "score"), digits = 1) }) - output$synposis <- renderText({ - results <- results() - - sprintf( - "Found %i candidates including %i/%i verified and %i/%i suggested \ - TPE-OLD genes.", - results[, .N], - results[verified == TRUE, .N], - genes[verified == TRUE, .N], - results[suggested == TRUE, .N], - genes[suggested == TRUE, .N] - ) - }) - output$copy <- renderUI({ - results <- results() + results <- results_filtered() gene_ids <- results[, gene] names <- results[name != "", name] @@ -155,7 +138,7 @@ server <- function(input, output) { }) output$scatter <- renderPlotly({ - results <- results() + results <- results_filtered() gene_ids <- results[input$genes_rows_selected, gene] genes <- genes[id %chin% gene_ids] @@ -169,9 +152,38 @@ server <- function(input, output) { scatter_plot(results, species, genes, distances) }) + output$assessment_synopsis <- renderText({ + reference_gene_ids <- genes[suggested | verified == TRUE, id] + + reference_count <- results_filtered()[ + gene %chin% reference_gene_ids, + .N + ] + + reference_results <- results()[gene %chin% reference_gene_ids] + + sprintf( + "Included reference genes: %i/%i
\ + Mean rank of reference genes: %.1f
\ + Maximum rank of reference genes: %i", + reference_count, + length(reference_gene_ids), + reference_results[, mean(rank)], + reference_results[, max(rank)] + ) + }) + + output$rank_plot <- renderPlotly({ + rank_plot( + results(), + genes[suggested | verified == TRUE, id], + input$cutoff / 100 + ) + }) + output$gost <- renderPlotly({ if (input$enable_gost) { - result <- gost(results()[, gene], ordered_query = TRUE) + result <- gost(results_filtered()[, gene], ordered_query = TRUE) gostplot(result, capped = FALSE, interactive = TRUE) } else { NULL diff --git a/ui.R b/ui.R index a728617..470fb72 100644 --- a/ui.R +++ b/ui.R @@ -53,11 +53,7 @@ ui <- fluidPage( header = div(style = "margin-top: 16px"), tabPanel( "Results", - textOutput("synposis"), - div( - style = "margin-top: 16px", - uiOutput("copy") - ), + uiOutput("copy"), div( style = "margin-top: 16px", DTOutput("genes", height = "1000px") @@ -72,12 +68,16 @@ ui <- fluidPage( ) ), tabPanel( - "Ranks", - plotlyOutput( - "rank_plot", - width = "100%", - height = "600px" - ) + "Assessment", + htmlOutput("assessment_synopsis"), + div( + style = "margin-top: 16px", + plotlyOutput( + "rank_plot", + width = "100%", + height = "600px" + ) + ), ), tabPanel( "Analysis",