Created
March 6, 2022 13:57
-
-
Save lgatto/a88f7c68f42cf96e68dd42c12c8a76af to your computer and use it in GitHub Desktop.
DEP::run_app("LFQ")
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
library(dplyr) | |
library(tibble) | |
library(SummarizedExperiment) | |
library(DEP) | |
library(shiny) | |
library(shinydashboard) | |
ui <- shinyUI( | |
dashboardPage( | |
dashboardHeader(title = "DEP - LFQ"), | |
dashboardSidebar( | |
sidebarMenu( | |
menuItem("Files", selected = TRUE, | |
fileInput('file1', | |
'ProteinGroups.txt', | |
accept=c('text/csv', | |
'text/comma-separated-values,text/plain', | |
'.csv')), | |
fileInput('file2', | |
'ExperimentalDesign.txt', | |
accept=c('text/csv', | |
'text/comma-separated-values,text/plain', | |
'.csv')), | |
radioButtons("anno", | |
"Sample annotation", | |
choices = list("Parse from columns" = "columns", | |
"Use Experimental Design" = "expdesign"), | |
selected = "expdesign") | |
), | |
menuItemOutput("columns"), | |
menuItem("Imputation options", | |
radioButtons("imputation", | |
"Imputation type", | |
choices = c("man", MsCoreUtils::imputeMethods()), | |
selected = "MinProb"), | |
p(a("Detailed information link", | |
href = "https://rformassspectrometry.github.io/MsCoreUtils/reference/imputation.html", | |
target="_blank")) | |
), | |
actionButton("analyze", "Analyze"), | |
tags$hr(), | |
uiOutput("downloadTable"), | |
uiOutput("downloadButton") | |
) | |
), | |
dashboardBody( | |
helpText("Please cite: "), | |
fluidRow( | |
box(numericInput("p", | |
"adj. P value", | |
min = 0.0001, max = 0.1, value = 0.05), | |
width = 2), | |
box(numericInput("lfc", | |
"Log2 fold change", | |
min = 0, max = 10, value = 1), | |
width = 2), | |
infoBoxOutput("significantBox"), | |
box(radioButtons("pres", | |
"Data presentation", | |
c("contrast", "centered"), | |
selected = "contrast"), | |
width = 2), | |
box(radioButtons("contrasts", | |
"Contrasts", | |
c("control", "all"), | |
selected = "control"), | |
width = 2) | |
), | |
fluidRow( | |
column(width = 7, | |
box(title = "Top Table", | |
box(uiOutput("select"), width = 6), | |
box(uiOutput("exclude"), width = 6), | |
DT::dataTableOutput("table"), width = 12) | |
), | |
column(width = 5, | |
tabBox(title = "Result Plots", width = 12, | |
tabPanel(title = "Selected Protein", | |
plotOutput("selected_plot"), | |
downloadButton('downloadPlot', 'Save plot')), | |
tabPanel(title = "Heatmap", | |
fluidRow( | |
box(numericInput("k", | |
"Kmeans clusters", | |
min = 0, max = 15, value = 7), | |
width = 4), | |
box(numericInput("limit", | |
"Color limit (log2)", | |
min = 0, max = 16, value = 6), | |
width = 4), | |
box(numericInput("size", | |
"Heatmap size (4-30)", | |
min = 4, max = 30, value = 10), | |
width = 4) | |
), | |
fluidRow( | |
uiOutput("plot"), | |
downloadButton('downloadHeatmap', 'Save heatmap')) | |
), | |
tabPanel(title = "Volcano plot", | |
fluidRow( | |
box(uiOutput("volcano_cntrst"), width = 6), | |
box(numericInput("fontsize", | |
"Font size", | |
min = 0, max = 8, value = 4), | |
width = 3), | |
box(checkboxInput("check_names", | |
"Display names", | |
value = TRUE), | |
checkboxInput("p_adj", | |
"Adjusted p values", | |
value = FALSE), | |
width = 3) | |
), | |
fluidRow( | |
plotOutput("volcano", height = 600), | |
downloadButton('downloadVolcano', 'Save volcano') | |
) | |
) | |
), | |
tabBox(title = "QC Plots", width = 12, | |
tabPanel(title = "Protein Numbers", | |
plotOutput("numbers", height = 600), | |
downloadButton('downloadNumbers', 'Save') | |
), | |
tabPanel(title = "Sample coverage", | |
plotOutput("coverage", height = 600), | |
downloadButton('downloadCoverage', 'Save') | |
), | |
tabPanel(title = "Normalization", | |
plotOutput("norm", height = 600), | |
downloadButton('downloadNorm', 'Save') | |
), | |
tabPanel(title = "Missing values - Quant", | |
plotOutput("detect", height = 600), | |
downloadButton('downloadDetect', 'Save') | |
), | |
tabPanel(title = "Missing values - Heatmap", | |
plotOutput("missval", height = 600), | |
downloadButton('downloadMissval', 'Save') | |
), | |
tabPanel(title = "Imputation", | |
plotOutput("imputation", height = 600), | |
downloadButton('downloadImputation', 'Save') | |
) | |
) | |
) | |
) | |
) | |
) | |
) | |
server <- shinyServer(function(input, output) { | |
options(shiny.maxRequestSize=200*1024^2) | |
### UI functions ### -------------------------------------------------------- | |
output$columns <- renderMenu({ | |
menuItem("Columns", | |
selectizeInput("name", | |
"Name column", | |
choices=colnames(data()), | |
selected = "Gene.names"), | |
selectizeInput("id", | |
"ID column", | |
choices=colnames(data()), | |
selected = "Protein.IDs"), | |
selectizeInput("filt", | |
"Filter on columns" , | |
colnames(data()), | |
multiple = TRUE, | |
selected = c("Reverse","Potential.contaminant")), | |
if (input$anno == "columns" & !is.null(data())) { | |
cols <- grep("^LFQ", colnames(data())) | |
prefix <- get_prefix(data()[,cols] %>% colnames()) | |
selectizeInput("control", "Control", | |
choices=make.names(colnames(data())[cols] %>% | |
gsub(prefix,"",.) %>% | |
substr(., 1, nchar(.)-1))) | |
}, | |
if (input$anno == "expdesign" & !is.null(expdesign())) { | |
selectizeInput("control", | |
"Control", | |
choices = make.names(expdesign()$condition)) | |
} | |
) | |
}) | |
### Reactive functions ### -------------------------------------------------- | |
data <- reactive({ | |
inFile <- input$file1 | |
if (is.null(inFile)) | |
return(NULL) | |
read.csv(inFile$datapath, header = TRUE, | |
sep = "\t", stringsAsFactors = FALSE) %>% | |
mutate(id = row_number()) | |
}) | |
expdesign <- reactive({ | |
inFile <- input$file2 | |
if (is.null(inFile)) | |
return(NULL) | |
read.csv(inFile$datapath, header = TRUE, | |
sep = "\t", stringsAsFactors = FALSE) %>% | |
mutate(id = row_number()) | |
}) | |
filt <- reactive({ | |
data <- data() | |
cols <- grep("^LFQ", colnames(data)) | |
filtered <- DEP:::filter_MaxQuant(data, input$filt) | |
unique_names <- make_unique(filtered, input$name, input$id) | |
if (input$anno == "columns") { | |
se <- make_se_parse(unique_names, cols) | |
} | |
if (input$anno == "expdesign") { | |
se <- make_se(unique_names, cols, expdesign()) | |
} | |
filter_missval(se, 0) | |
}) | |
norm <- reactive({ | |
normalize_vsn(filt()) | |
}) | |
imp <- reactive({ | |
DEP::impute(norm(), input$imputation) | |
}) | |
df <- reactive({ | |
validate( | |
need(input$control != "", "Please select a control condition") | |
) | |
test_diff(imp(), input$contrasts, input$control) | |
}) | |
dep <- reactive({ | |
add_rejections(df(), input$p, input$lfc) | |
}) | |
### All object and functions upon 'Analyze' input ### ---------------------- | |
observeEvent(input$analyze, { | |
### Interactive UI functions ### ------------------------------------------ | |
output$downloadTable <- renderUI({ | |
selectizeInput("dataset", | |
"Choose a dataset to save" , | |
c("results","significant_proteins", | |
"displayed_subset","full_dataset")) | |
}) | |
output$downloadButton <- renderUI({ | |
downloadButton('downloadData', 'Save') | |
}) | |
output$significantBox <- renderInfoBox({ | |
num_total <- dep() %>% | |
nrow() | |
num_signif <- dep() %>% | |
.[rowData(.)$significant, ] %>% | |
nrow() | |
frac <- num_signif / num_total | |
if(frac > 0.2) { | |
info_box <- infoBox("Significant proteins", | |
paste0(num_signif, | |
" out of ", | |
num_total), | |
paste0("Too large fraction (", | |
signif(frac * 100, digits = 3), | |
"%) of proteins differentially expressed"), | |
icon = icon("minus", lib = "glyphicon"), | |
color = "orange", | |
width = 4) | |
} | |
if(frac == 0) { | |
info_box <- infoBox("Significant proteins", | |
paste0(num_signif, | |
" out of ", | |
num_total), | |
"No proteins differentially expressed", | |
icon = icon("thumbs-down", lib = "glyphicon"), | |
color = "red", | |
width = 4) | |
} | |
if(frac > 0 & frac <= 0.2) { | |
info_box <- infoBox("Significant proteins", | |
paste0(num_signif, | |
" out of ", | |
num_total), | |
paste0(signif(frac * 100, digits = 3), | |
"% of proteins differentially expressed"), | |
icon = icon("thumbs-up", lib = "glyphicon"), | |
color = "green", | |
width = 4) | |
} | |
info_box | |
}) | |
output$select <- renderUI({ | |
row_data <- rowData(dep()) | |
cols <- grep("_significant", colnames(row_data)) | |
names <- colnames(row_data)[cols] | |
names <- gsub("_significant", "", names) | |
selectizeInput("select", | |
"Select direct comparisons", | |
choices=names, | |
multiple = TRUE) | |
}) | |
output$exclude <- renderUI({ | |
row_data <- rowData(dep()) | |
cols <- grep("_significant", colnames(row_data)) | |
names <- colnames(row_data)[cols] | |
names <- gsub("_significant","",names) | |
selectizeInput("exclude", | |
"Exclude direct comparisons", | |
choices = names, | |
multiple = TRUE) | |
}) | |
output$volcano_cntrst <- renderUI({ | |
if (!is.null(selected())) { | |
df <- rowData(selected()) | |
cols <- grep("_significant$",colnames(df)) | |
selectizeInput("volcano_cntrst", | |
"Contrast", | |
choices = gsub("_significant", "", colnames(df)[cols])) | |
} | |
}) | |
### Reactive functions ### ------------------------------------------------ | |
excluded <- reactive({ | |
DEP:::exclude_deps(dep(), input$exclude) | |
}) | |
selected <- reactive({ | |
DEP:::select_deps(excluded(), input$select) | |
}) | |
res <- reactive({ | |
get_results(selected()) | |
}) | |
table <- reactive({ | |
DEP:::get_table(res(), input$pres) | |
}) | |
selected_plot_input <- reactive ({ | |
if(!is.null(input$table_rows_selected)) { | |
selected_id <- table()[input$table_rows_selected,1] | |
plot_single(selected(), selected_id, input$pres) | |
} | |
}) | |
heatmap_input <- reactive({ | |
withProgress(message = 'Plotting', value = 0.66, { | |
plot_heatmap(selected(), | |
input$pres, | |
kmeans = TRUE, | |
input$k, | |
input$limit) | |
}) | |
}) | |
volcano_input <- reactive({ | |
if(!is.null(input$volcano_cntrst)) { | |
plot_volcano(selected(), | |
input$volcano_cntrst, | |
input$fontsize, | |
input$check_names, | |
input$p_adj) | |
} | |
}) | |
norm_input <- reactive({ | |
plot_normalization(filt(), | |
norm()) | |
}) | |
missval_input <- reactive({ | |
plot_missval(norm()) | |
}) | |
detect_input <- reactive({ | |
plot_detect(norm()) | |
}) | |
imputation_input <- reactive({ | |
plot_imputation(norm(), | |
df()) | |
}) | |
numbers_input <- reactive({ | |
plot_numbers(norm()) | |
}) | |
coverage_input <- reactive({ | |
plot_coverage(norm()) | |
}) | |
### Output functions ### -------------------------------------------------- | |
output$table <- DT::renderDataTable({ | |
table() | |
}, options = list(pageLength = 25, scrollX = T), | |
selection = list(selected = c(1))) | |
output$selected_plot <- renderPlot({ | |
selected_plot_input() | |
}) | |
output$heatmap <- renderPlot({ | |
heatmap_input() | |
}) | |
output$volcano <- renderPlot({ | |
volcano_input() | |
}) | |
output$norm <- renderPlot({ | |
norm_input() | |
}) | |
output$missval <- renderPlot({ | |
missval_input() | |
}) | |
output$detect <- renderPlot({ | |
detect_input() | |
}) | |
output$imputation <- renderPlot({ | |
imputation_input() | |
}) | |
output$numbers <- renderPlot({ | |
numbers_input() | |
}) | |
output$coverage <- renderPlot({ | |
coverage_input() | |
}) | |
observe({ | |
output$plot <- renderUI({ | |
plotOutput("heatmap", height = (100 * as.numeric(input$size))) | |
}) | |
}) | |
### Download objects and functions ### ------------------------------------ | |
datasetInput <- reactive({ | |
switch(input$dataset, | |
"results" = get_results(dep()), | |
"significant_proteins" = get_results(dep()) %>% | |
filter(significant) %>% | |
select(-significant), | |
"displayed_subset" = res() %>% | |
filter(significant) %>% | |
select(-significant), | |
"full_dataset" = get_df_wide(dep())) | |
}) | |
output$downloadData <- downloadHandler( | |
filename = function() { paste(input$dataset, ".txt", sep = "") }, | |
content = function(file) { | |
write.table(datasetInput(), | |
file, | |
col.names = TRUE, | |
row.names = FALSE, | |
sep ="\t") } | |
) | |
output$downloadPlot <- downloadHandler( | |
filename = function() { | |
paste0("Barplot_", table()[input$table_rows_selected,1], ".pdf") | |
}, | |
content = function(file) { | |
pdf(file) | |
print(selected_plot_input()) | |
dev.off() | |
} | |
) | |
output$downloadHeatmap <- downloadHandler( | |
filename = 'Heatmap.pdf', | |
content = function(file) { | |
pdf(file, height = 10, paper = "a4") | |
print(heatmap_input()) | |
dev.off() | |
} | |
) | |
output$downloadVolcano <- downloadHandler( | |
filename = function() { | |
paste0("Volcano_", input$volcano_cntrst, ".pdf") | |
}, | |
content = function(file) { | |
pdf(file) | |
print(volcano_input()) | |
dev.off() | |
} | |
) | |
output$downloadNorm <- downloadHandler( | |
filename = "normalization.pdf", | |
content = function(file) { | |
pdf(file) | |
print(norm_input()) | |
dev.off() | |
} | |
) | |
output$downloadMissval <- downloadHandler( | |
filename = "missing_values_heatmap.pdf", | |
content = function(file) { | |
pdf(file) | |
print(missval_input()) | |
dev.off() | |
} | |
) | |
output$downloadDetect <- downloadHandler( | |
filename = "missing_values_quant.pdf", | |
content = function(file) { | |
pdf(file) | |
gridExtra::grid.arrange(detect_input()) | |
dev.off() | |
} | |
) | |
output$downloadImputation <- downloadHandler( | |
filename = "imputation.pdf", | |
content = function(file) { | |
pdf(file) | |
print(imputation_input()) | |
dev.off() | |
} | |
) | |
output$downloadNumbers <- downloadHandler( | |
filename = "numbers.pdf", | |
content = function(file) { | |
pdf(file) | |
print(numbers_input()) | |
dev.off() | |
} | |
) | |
output$downloadCoverage <- downloadHandler( | |
filename = "coverage.pdf", | |
content = function(file) { | |
pdf(file) | |
print(coverage_input()) | |
dev.off() | |
} | |
) | |
}) | |
}) | |
shinyApp(ui = ui, server = server) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment