diff --git a/dge_workflow/dge_utils.sh b/dge_workflow/dge_utils.sh
index cbe7cf6d2c83db29996dd5b1f03f0c622aed3e2c..8b8e0e86f70f9eb1e22ca4152d5c2b08fa869108 100755
--- a/dge_workflow/dge_utils.sh
+++ b/dge_workflow/dge_utils.sh
@@ -463,7 +463,6 @@ dge_create_explorer_app() {
files='tpms_by_replicate.txt fpkms_by_replicate.txt de_results.txt basic_design.txt'
ls $files 2>/dev/null || { echo "Can not create app, because not all required data files ($files) exist in the current directory" 1>&2; return; }
-appify ${NGS_TOOLS}/dge_workflow/expression_explorer/run_expression_explorer.sh
-
+appify ${NGS_TOOLS}/dge_workflow/expression_explorer/expression_explorer.R "expression_explorer"
}
export -f dge_create_explorer_app
\ No newline at end of file
diff --git a/dge_workflow/expression_explorer/app.R b/dge_workflow/expression_explorer/app.R
deleted file mode 100644
index faaf39d8b368889bbcb69cf6942b3ef5edba362f..0000000000000000000000000000000000000000
--- a/dge_workflow/expression_explorer/app.R
+++ /dev/null
@@ -1,300 +0,0 @@
-#!/usr/bin/env Rscript
-#+ include=FALSE
-#--------------------------------------------------------------------
-# Title : Expression Explorer
-# Objective : shinyApp to explore differentially expressed genes
-
-# run shiny app from a bash file: Rscript -e "shiny::runApp('expression_explorer/', launch.browser=TRUE)"
-# https://shiny.rstudio.com/reference/shiny/1.0.5/
-# http://rstudio.github.io/DT/
-#--------------------------------------------------------------------
-
-
-# LOAD packages --------------------------------------------------------------------------------------------------------
-devtools::source_url("https://raw.githubusercontent.com/holgerbrandl/datautils/v1.44/R/core_commons.R")
-library(shiny)
-library(shinyFiles)
-library(DT)
-library(plotly)
-library(shinyjqui)
-
-
-# FUNCTIONS ------------------------------------------------------------------------------------------------------------
-
-calc_ci = function(df, variable, ci_interval=0.95){
- variable <- enquo(variable)
-
- # http://dplyr.tidyverse.org/articles/programming.html
- mean_name <- paste0( quo_name(variable), "_mean")
- ci_name <- paste0(quo_name(variable), "_ci")
- # echo(glue::glue("varname is {ci_name}"))
-
- df %>% summarize(
- mean=mean(!!variable),
- sd=sd(!!variable),
- N = n(),
- se=sd/sqrt(N),
- !!ci_name := qt(ci_interval/2+0.5, N-1)*se,
- !!mean_name :=mean
- ) %>% select(-c(mean, sd, N, se, mean))
-}
-
-
-# LOAD data ------------------------------------------------------------------------------------------------------------
-
-# data %>% head()
-de_res <- read_tsv("de_results.txt") %>%
- transmute(external_gene_name, condition_1, condition_2, logfc = c1_over_c2_logfc, pvalue, padj, is_hit, c1_overex)
-de_res[,c(4:6)] <- round(de_res[,c(4:6)], 3)
-
-design <- read_tsv("basic_design.txt") %>% select(-batch)
-
-fpkms <- read_tsv("fpkms_by_replicate.txt") %>%
- mutate(method = "fpkm") %>%
- gather(replicate, rep_values, -c(ensembl_gene_id, gene_name, gene_description, method)) %>%
- left_join(design, by = "replicate")
-
-tpms <- read_tsv("tpms_by_replicate.txt") %>%
- mutate(method = "tpm") %>%
- gather(replicate, rep_values, -c(ensembl_gene_id, gene_name, gene_description, method)) %>%
- left_join(design, by = "replicate")
-
-all <- rbind(fpkms, tpms)
-
-#calculate confidence intervals:
-ci <- all %>% group_by(gene_name, condition, method) %>% calc_ci(., rep_values)
-all %<>% left_join(ci)
-# all %>% select(-gene_name, -gene_description) %>% arrange(ensembl_gene_id) %>% head()
-
-#extract gene_names
-gene_names <- sort(unique(all$gene_name))
-first_entry <- gene_names[1]
-sample_names <- unique(design$condition)
-
-# USER INTERFACE -------------------------------------------------------------------------------------------------------
-
-
-ui <- fixedPage(
-
- headerPanel("Expression Explorer"),
-
- fixedPage("",
- fixedRow(
- column(12, style = "height:20px")
- ),
-
- fixedRow(
-
- column(4, style = "height:100px",
- selectInput(inputId = "gene_name", label = "Gene name", choices = gene_names, multiple = TRUE, selected = first_entry, selectize=TRUE)
- ),
- column(4, style = "height:100px",
- radioButtons("method", label = "Normalization method", choiceNames = c("FPKM", "TPM"), choiceValues = c("fpkm", "tpm"))
- ),
- column(4, style = "height:100px",
- checkboxGroupInput("options", label = "Optional", choiceNames = c("show confidence interval", "show line"), choiceValues = c("plot_ci", "plot_line"))
- )
-
- ),
-
- fixedRow(
- column(12,
- orderInput("sample", label = "Change sample order:", items = sample_names)#,
- #verbatimTextOutput('order')
- )
- ),
-
- hr(),
-
- fixedRow(
- column(6, HTML(paste('
'))
- # htmlOutput("text", style = "font-size: 80%; width=75%")
- )
- ),
-
- # fixedRow(div(style = "margin_top:50px;"),
- fixedRow(
- column(6, HTML(paste('
', '
')),
- # plotlyOutput(outputId = "points"),
- plotOutput(outputId = "points")
- ),
-
- column(6, HTML(paste('
', '
')),
- tabPanel("table", DT::dataTableOutput("table"), style = "font-size: 75%; width: 75%")
- )
- )
- )
-)
-
-
-# shinyApp(ui = ui, server = server)
-
-
-# SERVER FUNCTIONS -----------------------------------------------------------------------------------------------------
-
-
-server <- function(input, output) {
-
- # prepare output data
- table_data <- reactive({
- de_res %>% filter(external_gene_name %in% input$gene_name) %>% select(-is_hit, -c1_overex)
- })
-
- # text_data <- reactive({
- # lapply(as.list(input$gene_name), function(x){data <- all %>% filter(gene_name == x) %>% select(gene_name, gene_description, ensembl_gene_id) %>% filter(!duplicated(gene_name))})
- # })
- # plot_data <- reactive({
- # lapply(as.list(input$gene_name), function(x){data <- all %>% filter(gene_name == x & grepl(input$method, method) & grepl(input$sample, sample))})
- # })
- # table_data <- reactive({
- # lapply(as.list(input$gene_name), function(x){data <- de_res %>% filter(external_gene_name == x) %>% select(-external_gene_name)})
- # })
-
-
- # prepare variable for text output
- str_gene <- tags$b("Gene name: ")
- str_desc <- tags$b("Gene description: ")
- str_ens <- tags$b("Ensembl gene ID: ")
-
- texting <- function(x) {
- HTML(paste('
', str_gene, x$gene_name, '
', str_ens, x$ensembl_gene_id, '
', str_desc, x$gene_description, '
', sep = ''))
- }
-
-
- # http://ggplot2.tidyverse.org/reference/stat_summary.html
- output$text <- renderUI({ texting(text_data()) })
-
-
- # output$points <- renderPlotly({
- output$points <- renderPlot({
- pd <- position_dodge(0.3)
-
- plot_data <- all %>% filter(gene_name %in% input$gene_name & grepl(input$method, method))
- # plot_data <- all %>% filter(gene_name %in% c("Gnai3", "Cdc45") & grepl("fpkm", method))
- plot_data$condition <- factor(plot_data$condition, levels = input$sample_order)
-
- plot <- ggplot(plot_data, aes(condition, rep_values, color = gene_name)) +
- geom_point(position=pd) +
- theme(axis.text.x = element_text(angle = 50, hjust = 1)) +
- ylab(paste(input$method, "s", sep = "")) +
- xlab("condition")
-
- if (is.element("plot_line", input$options)) {
- plot <- plot + geom_line(aes(condition, rep_values_mean, group = gene_name), data = plot_data, position=pd)
- }
-
- if (is.element("plot_ci", input$options)) {
- plot <- plot + geom_errorbar(aes(ymin=rep_values_mean-rep_values_ci, ymax=rep_values_mean+rep_values_ci), size = 0.2, position=pd)
- }
-
- if (is.element("plot_line", input$options) || is.element("plot_ci", input$options)) {
- } else {
- plot <- plot + stat_summary(fun.y="mean", geom="point", pch = "_", size=8, position = pd)
- }
- # stat_summary(fun.data = "mean_cl_boot", color = "black", size = 1,
- # geom = "errorbar", width = 1, fun.args = list(conf.int = 0.9), aes(group = gene_name),
- # position=position_dodge(width=0.4))
-
- plot(plot)
- # ggplotly(plot) %>% layout(margin = list(b = 95), legend = list(orientation = "h", y = 10))
- })
-
- output$table <- DT::renderDataTable({ DT::datatable(table_data()) })
-
-
-}
-
-shinyApp(ui = ui, server = server)
-
-
-
-
-###############################################
-
-#ALTERNATIVE: try to plot results for more than one gene (i.e. multiple plots and multiple tables)
-
-# ui <- fixedPage(
-#
-# tabsetPanel(
-#
-# headerPanel("Exploring differentially expressed genes"),
-#
-# fixedPage("",
-# fixedRow(
-# column(12, style = "height:20px")
-# ),
-#
-# fixedRow(
-# column(4, style = "height:100px; background-color:lightblue",
-# selectInput(inputId = "gene_name", label = "Gene name", choices = gene_names, multiple = TRUE, selected = first_entry, selectize=TRUE)
-# ),
-# column(4, style = "height:100px; background-color:lightblue",
-# radioButtons("method", label = "Normalization method", choiceNames = c("FPKM", "TPM", "display both"), choiceValues = c("fpkm", "tpm", "fpkm|tpm"))
-# ),
-# column(4, style = "height:100px; background-color:lightblue",
-# radioButtons("sample", label = "Sample level", choiceNames = c("by condition (con)", "by replicate (rep)", "display both"), choiceValues = c("con", "rep", "con|rep"))
-# )
-# ),
-#
-# fixedRow(
-# column(6, uiOutput(outputId = "plots")
-# ),
-# column(6, uiOutput(outputId = "tables")
-# )
-# )
-# )
-# )
-# )
-#
-# server <- function(input, output) {
-#
-#
-# output$plots <- renderUI({
-# plot_output_list <- lapply(1:length(input$gene_name), function(i) {
-# plotname <- paste("plot", i, sep="")
-# plotOutput(plotname, height = 280, width = 250)
-# })
-# do.call(tagList, plot_output_list)
-# })
-#
-# output$tables <- renderUI({
-# table_output_list <- lapply(1:length(input$gene_name), function(i) {
-# tablename <- paste("table", i, sep="")
-# dataTableOutput(tablename)
-# })
-# })
-#
-#
-# for (i in 1:5) {
-# local({
-# my_i <- i
-# plotname <- paste("plot", my_i, sep="")
-# tablename <- paste("table", my_i, sep="")
-#
-# output[[tablename]] <- renderDataTable({
-# de_res %>% filter(external_gene_name == input$gene_name[my_i]) %>% select(-external_gene_name)
-# })
-#
-# output[[plotname]] <- renderPlot({
-# all %>% filter(gene_name == input$gene_name[my_i] & grepl(input$method, method) & grepl(input$sample, sample)) %>%
-# ggplot(aes(condition, value, shape = method, color = sample, alpha = 0.5)) +
-# geom_point() +
-# # geom_jitter(width = 0.1)+
-# theme(axis.text.x = element_text(angle = 50, hjust = 1))
-# })
-#
-# })
-# }
-#
-# }
-#
-# shinyApp(ui = ui, server = server)
-
-
-# only TPMs or FPKMs
-# always rep and con (con = dash)
-# allow more than one gene (position_dodge)
-# optional: confidence intervals
-# optional: progession lines
-# optional: config file for sorting
-# footer: "https://www.mpi-cbg.de/en/services-facilities/core-facilities/scientific-computing-facility/services/"
\ No newline at end of file
diff --git a/dge_workflow/expression_explorer/run_expression_explorer.sh b/dge_workflow/expression_explorer/expression_explorer.R
similarity index 91%
rename from dge_workflow/expression_explorer/run_expression_explorer.sh
rename to dge_workflow/expression_explorer/expression_explorer.R
index b5d8358a0108c8f3afb2d4707d6cfc528c4d6905..dc5a6ec7baeb4ca8c87d8c25e156b9d520cf7591 100644
--- a/dge_workflow/expression_explorer/run_expression_explorer.sh
+++ b/dge_workflow/expression_explorer/expression_explorer.R
@@ -1,15 +1,4 @@
-#!/usr/bin/env bash
-
-#https://christopher.su/2012/creating-mac-applications-shell-scripts/
-
-export SCRIPT_DIRECTORY="$(dirname "$0")/"
-
-#https://stackoverflow.com/questions/26465240/how-to-execute-a-shell-script-from-within-an-app-and-show-it-in-the-terminal
-#osascript -e 'display notification "Starting expression explorer... Please be patient, it may require some minutes to install required dependencies on first launch'
-
-# To use Rscript as interpreter see https://stackoverflow.com/questions/1815606/rscript-determine-path-of-the-executing-script
-
-/usr/local/bin/Rscript -<<"EOF" ${SCRIPT_DIRECTORY}
+#!/usr/bin/env Rscript
# run shiny app from a bash file: Rscript -e "shiny::runApp('expression_explorer/', launch.browser=TRUE)"
# https://shiny.rstudio.com/reference/shiny/1.0.5/
@@ -30,8 +19,14 @@ load_pack(shinyjqui)
# GET path--------------------------------------------------------------------------------------------------------------
#Sys.getenv("DA_BIN_ICH")
-dataPath= args[1] %>% dirname()%>% dirname()%>% dirname()
+# dataPath= args[1] %>% dirname()%>% dirname()%>% dirname()
+# https://stackoverflow.com/questions/1815606/rscript-determine-path-of-the-executing-script
+initial.options <- commandArgs(trailingOnly = FALSE)
+file.arg.name <- "--file="
+script.name <- sub(file.arg.name, "", initial.options[grep(file.arg.name, initial.options)])
+# script.name="/Volumes/cerebral-organoids/RNA-Seq/data/hsap/dge_analysis/expression_explorer.app/Contents/MacOS/expression_explorer"
+dataPath= script.name %>% dirname() %>% dirname()%>% dirname() %>% dirname()
# FUNCTIONS ------------------------------------------------------------------------------------------------------------
@@ -204,6 +199,4 @@ app <- shinyApp(
#runApp(app)
runApp(app, launch.browser=TRUE)
-#shinyApp(ui = ui, server = server)
-
-EOF
\ No newline at end of file
+#shinyApp(ui = ui, server = server)
\ No newline at end of file