Initial commit

parents
Pipeline #16478 failed with stage
in 14 seconds
stages:
- buildimage
Build Image Master:
image:
name: gcr.io/kaniko-project/executor:debug-v0.21.0
entrypoint: [""]
stage: buildimage
script:
- echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
- /kaniko/executor --cache=true --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE:$(date +%Y%m%d%H%M)-$CI_COMMIT_SHORT_SHA
only:
refs:
- master
FROM rocker/shiny:3.6.1
RUN apt-get update && apt-get install -y libtiff-dev \
libjpeg-dev libfftw3-dev libhdf5-dev libssl-dev \
libxml2-dev libgmp3-dev
ADD etc/ /etc/shiny-server/
COPY ./packages.R packages.R
COPY global.R /srv/shiny-server/
COPY server.R /srv/shiny-server/
COPY ui.r /srv/shiny-server/
RUN Rscript packages.R
# Spacem viewer
Repo for the Spacem viewer app
# .libPaths("/home/shiny/rlibs")
#shiny: was shiny_0.12.2
#load("data/plotme.rda") #loads scaled data, required for tSNE
#load("data/001_clusterings.rda")
# load("data/LCM.rda")
# load("data/001_limma.rda")
# filterInfo$Sample.type[filterInfo$Sample.type %in% c("BIG VESSEL","ARTERIES SMALL","ARTERIES LOW")] <- "ARTERIES"
#Pos_seu<-readRDS("Data/BM_Mofa.rds")
#Idents(Pos_seu)<-Pos_seu$Prediction_All
#WhichCells(Luca_small,idents = 9,expression = ds =='U1')
require(ggplot2)
require(reshape2)
require(plyr)
require(gridExtra)
require(grid)
require(DT)
require(Seurat)
require(ggrepel)
require(RColorBrewer)
require(dplyr)
require(plotly)
require(shinycustomloader)
#saveRDS(Luca_small,"Data/LUCA_small.rds")
Luca_small<-readRDS("Data/LUCA_small.rds")
Simon_small<-readRDS("Data/Simon_small.rds")
Manuscript_small<-readRDS("Data/Manuscript_small.rds")
#Simon_small<-NormalizeData(Simon_small)
#Simon_small$Condition<-ifelse(Simon_small$ds %in% c("M0_2_low","M0_1_low"),"M0",
# ifelse(Simon_small$ds %in% c("M1_2_low","M1_1_low"),"M1","M2"))
#Simon_small$Condition<-Simon_small$ds
#saveRDS(Simon_small,"Data/Simon_small.rds")
g_legend <- function(a.gplot){
tmp <- ggplot_gtable(ggplot_build(a.gplot))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
legend
}
#
# otsu <- function(h) {
# total = sum(h$counts)
# sumB = 0;
# wB = 0;
# maximum = 0.0;
# sum1 <- 0
# for (j in 1:(length(h$breaks)-1)) {
# sum1 <- sum1 + h$breaks[j] * h$counts[j]
# }
# for (ii in 1:(length(h$breaks)-1)) {
# wB = wB + h$counts[ii]
# wF = total - wB;
# if (wB == 0 || wF == 0) next;
# sumB = sumB + h$breaks[ii] * h$counts[ii];
# mF = (sum1 - sumB) / wF;
# between = wB * wF * ((sumB / wB) - mF) * ((sumB / wB) - mF);
# if ( between >= maximum ){
# level = h$breaks[ii];
# maximum = between;
# }
# }
# return(level)
# }
#
# Pos_seu<-readRDS("Data/BM1.rds")
# OtsuTresh<-NULL
# for(i in rownames(Pos_seu@assays$AB@data))
# {
# file <- try(otsu(hist(Pos_seu@assays$AB@data[i,],breaks=100)))
# if (class(file) == 'try-error') {
# OtsuTresh[i]<-0
# }
# else{OtsuTresh[i]<-file}
#
# }
# BM1<-Pos_seu
# OtsuTresh_BM1<-OtsuTresh
# rm(Pos_seu)
# rm(file)
# rm(i)
# rm(OtsuTresh)
# save.image('Data/BM1.rda')
# Pos_seu<-readRDS("Data/BM_Mofa.rds")
# Idents(Pos_seu)<-Pos_seu$Prediction_All
# OtsuTresh<-NULL
# for(i in rownames(Pos_seu@assays$AB@data))
# {
# file <- try(otsu(hist(Pos_seu@assays$AB@data[i,],breaks=100)))
# if (class(file) == 'try-error') {
# OtsuTresh[i]<-0
# }
# else{OtsuTresh[i]<-file}
#
# }
#
# BM123<-Pos_seu
# OtsuTresh_BM123<-OtsuTresh
# rm(Pos_seu)
# rm(file)
# rm(i)
# rm(OtsuTresh)
# save.image('Data/BM_123.rda')
#
# BM1@meta.data$Cell_Type3<-factor(x = BM1@meta.data$Cell_Type3, levels = order$X1)
# Idents(BM1)<-BM1@meta.data$Cell_Type3
# plot<-DimPlot(BM1, reduction = "MOFAUMAP",label = T)+NoLegend()
# BM1 <- CellSelector(plot = plot, object = BM1, ident = "Doublet and Triplets")
# BM1<-subset(BM1,idents = c("Doublet and Triplets","Doublet T and Neutrophils"),invert=T)
#
#
# BM123@meta.data$Prediction_All<-factor(x = BM123@meta.data$Prediction_All, levels = order$X1)
# Idents(BM123)<-BM123@meta.data$Prediction_All
# DimPlot(BM123, reduction = "MOFAUMAP",label = T)+NoLegend()
# save.image('Data/BM_123.rda')
#
# This is the server logic of a Shiny web application. You can run the
# application by clicking 'Run App' above.
#
# Find out more about building applications with Shiny here:
#
# http://shiny.rstudio.com/
#
library(shiny)
# Define server logic required to draw a histogram
shinyServer(function(input, output, session) {
fonts <- function(x) paste0(substr(x,1,1),tolower(substr(x,2,nchar(x))))
Pos_seu <- reactive({
if(input$Sample=="Hepatocytes"){
Pos_seu=Luca_small
}
else if(input$Sample=="Manuscript"){
Pos_seu=Manuscript_small
}
else{
Pos_seu=Simon_small
}}
)
output$columns = renderUI({
if (input$tsne.type == "Clusters") {
}
else if(input$tsne.type == "Metabolites/Features"){
selectizeInput("tsne.gene", "Metabolite or Feature to display", choices = unname(c(rownames(Pos_seu()),'fluo',"Fluorescence",rownames(Pos_seu()@assays$AllFeat))),multiple = F,options = list(placeholder = 'select a marker ') )
}
else if(input$tsne.type == "Cell type"){
}
else{
}
})
output$order = renderUI({
if (input$tsne.type == "Clusters") {
NULL
}
else if(input$tsne.type == "Metabolites/Features"){
radioButtons("order", label="Select if you want your Violin plot ordered by the cluster or the metabolite/feature expression", selected = "Cluster", choices = c("Cluster","Expression"))
}
else if(input$tsne.type == "Datasets"){
NULL
}
else{
NULL
}
})
#Flip <- reactiveValues(flip='NoLegend()')
OrderVln <- reactive(
{
Pos_vln<-Pos_seu()
Idents(Pos_vln)<-Pos_vln$ClusterID
if(input$order=='Cluster') {
VlnPlot(Pos_vln,features = input$tsne.gene,sort = F,pt.size = 0.001)+NoLegend()+ coord_flip()+xlab('Cluster')
}
else{
VlnPlot(Pos_vln,features = input$tsne.gene,sort = T,pt.size = 0.001)+NoLegend()+ coord_flip()+xlab('Cluster')
}
})
#})
Values1<-reactiveValues(omic=NULL,umap=NULL)
Omics <- observe({
if(is.null(input$tsne.gene))
{
Values1$omic=GetAssayData(Pos_seu(),slot = 'data',assay = 'RNA')
}
else{
if(input$tsne.gene %in% rownames(Pos_seu())){
Values1$omic=GetAssayData(Pos_seu(),slot = 'data',assay = 'RNA')
}
else if(input$tsne.gene %in% rownames(Pos_seu()@assays$AllFeat)){
Values1$omic=GetAssayData(Pos_seu(),slot = 'data',assay = 'AllFeat')
}
else{
Values1$omic=t(Pos_seu()@meta.data)
}
}}
)
Umap <- observe({
if(input$umap.type == "Integrated UMAP"){
Values1$umap<-Pos_seu()@reductions$UMAP.INTEGRATED@cell.embeddings
}
else if(input$umap.type == "Features UMAP"){
Values1$umap<-Pos_seu()@reductions$UMAPfeatures@cell.embeddings
}
else if(input$umap.type == "MOFA-UMAP"){
Values1$umap<-Pos_seu()@reductions$MOFAUMAP@cell.embeddings
}
else if(input$umap.type == "SpaceM-UMAP"){
Values1$umap<-cbind(Simon_small$UMAPX,Simon_small$UMAPY)
}
else{
Values1$umap<-Pos_seu()@reductions$umap@cell.embeddings
}}
)
output$hover_info <- renderPrint({
tsne<-Values1$umap
x <- (tsne[,1] - input$plot_hover$x)^2
y <- (tsne[,2] - input$plot_hover$y)^2
point <- which.min(x + y)
if(min(x+y) < 1) {
if(input$tsne.type=='Metabolites/Features'){
cat(paste("Expression of",input$tsne.gene,': '), as.character(round(Values1$omic[input$tsne.gene,][point],digits = 3)),"\n")
}
cat("Dataset: ", as.character(Pos_seu()$ds[point]),"\n")
cat("Raw Cluster: ", as.character(Pos_seu()$ClusterID[point]))
} else {
cat("Hover over a point to get info.")
}
})
output$plotTsne = renderUI({
plotOutput(outputId = "tsne.pl",hover = hoverOpts(id = "plot_hover"),width = (0.4 * as.numeric(input$dimension[1])),
height = (0.6 * as.numeric(input$dimension[2])))})
output$plotPie = renderUI({
plotOutput(outputId = "image.pl",width = (0.55 * as.numeric(input$dimension[1])),
height = (0.6 * as.numeric(input$dimension[2])))})
output$plotLegend = renderUI({
if(input$tsne.type=="Metabolites/Features"){
plotOutput("legend.tsne",height = '800px')}
else{plotOutput("legend.tsne",height = '200px')}
})
output$plotPseudo = renderUI({
if(input$tsne.type=="Metabolites/Features"){
plotOutput("pseudo",height = '350px')}
else{plotOutput("pseudo",height = '10px')}
})
output$tsne.pl <- renderPlot({
tsne<-Values1$umap
if (input$tsne.type == "Clusters") {
p<-qplot(x = tsne[,1] , y= tsne[,2], color = as.character(Pos_seu()$ClusterID))+ xlab("UMAP1")+ylab("UMAP2")+
theme_classic(base_size = 16) + theme(axis.text = element_blank(),axis.ticks=element_blank()) +NoLegend()
p<-p+labs(fill='Raw Clusters')
#p<-p+geom_point(aes(text=map(paste('<b>Cell type:</b>', Idents(Pos_seu()) , '<br>', '<b>Cluster:</b>', Pos_seu()$ClusterID), HTML)))
p
#ggplotly(p, tooltip="text" )
}
else if (input$tsne.type == "Datasets"){
p<-qplot(x = tsne[,1] , y= tsne[,2], color = Pos_seu()$ds)+xlab("UMAP1")+ylab("UMAP2")+
theme_classic(base_size = 16) + theme(axis.text = element_blank(),axis.ticks=element_blank()) +NoLegend()
p<-p+labs(fill='Cell types')
#p<-p+geom_point(aes(text=map(paste('<b>Cell type:</b>', Idents(Pos_seu()) , '<br>', '<b>Cluster:</b>', Pos_seu()$ClusterID), HTML)))
p
##ggplotly(p, tooltip="text" )
}
else if (input$tsne.type == "Metabolites/Features"){
p<-qplot(x = tsne[,1] , y= tsne[,2],size=I(0.6), color = as.numeric(Values1$omic[input$tsne.gene,])) + scale_color_gradientn(name = input$tsne.gene, colours = c("black","blue","red","yellow"))+xlab("UMAP1")+ylab("UMAP2")+
theme_classic(base_size = 16) + theme(axis.text = element_blank(),axis.ticks=element_blank())+theme(legend.position = "bottom",legend.title=element_text(size=8),
legend.text=element_text(size=8))
p<-p+labs(fill='Scale')
#p<-p+geom_point(aes(text=map(paste('<b>Cell type:</b>', Idents(Pos_seu()) , '<br>', '<b>Cluster:</b>', Pos_seu()$ClusterID), HTML)))
p
##ggplotly(p, tooltip="text" )
}
else{
p<-qplot(x = tsne[,1] , y= tsne[,2], color = dataInput()$scheme)+xlab("UMAP1")+ylab("UMAP2")+
theme_classic(base_size = 16) + theme(axis.text = element_blank(),axis.ticks=element_blank()) +NoLegend()
p<-p +scale_color_manual(name=NULL,values =c("#90a9c2","#e16a2d"))
#p<-p+geom_point(aes(text=map(paste('<b>Cell type:</b>', Idents(Pos_seu()) , '<br>', '<b>Cluster:</b>', Pos_seu()$ClusterID), HTML)))
p
##ggplotly(p, tooltip="text" )
}
})
#Dim<-reactiveVal(dim=input$dimension)
output$image.pl <- renderPlot({
if (input$tsne.type == "Clusters") {
# Create a basic bar
proportion<-melt(table(Pos_seu()$ClusterID)) %>% mutate(freq = value / sum(value))
pie = ggplot(proportion, aes(x="", y=freq, fill=as.character(Var1))) + geom_bar(stat="identity", width=1)
# Convert to pie (polar coordinates) and add labels
pie = pie + coord_polar("y", start=0) + geom_text_repel(aes(label = paste0("Cluster",as.character(Var1),":",round(freq*100), "%")), position = position_stack(vjust = 0.5)) + theme_minimal(base_size = 16) + theme(axis.title = element_blank(), axis.text = element_blank(), panel.grid = element_blank())+NoLegend()
pie
}
else if (input$tsne.type == "Datasets"){
proportion<-melt(table(Pos_seu()$ds)) %>% mutate(freq = value / sum(value))
pie = ggplot(proportion, aes(x="", y=freq, fill=Var1)) + geom_bar(stat="identity", width=1)
# Convert to pie (polar coordinates) and add labels
pie = pie + coord_polar("y", start=0) + geom_text_repel(aes(label = paste0(Var1,":",round(freq*100), "%")), position = position_stack(vjust = 0.5)) + theme_minimal(base_size = 16) + theme(axis.title = element_blank(), axis.text = element_blank(), panel.grid = element_blank())+NoLegend()
pie
}
else if (input$tsne.type == "Metabolites/Features"){
OrderVln()
}
else {
proportion<-melt(table(Idents(Pos_seu())[dataInput()$scheme]))
proportion<-group_by(proportion, Var1) %>%
tally(value, sort = TRUE) %>%
group_by(Var1 = factor(c(as.character(Var1[1:8]), rep("Other", n() - 8)),
levels = c(as.character(Var1[1:8]), "Other"))) %>%
tally(n) %>% mutate(freq = n / sum(n))
pie = ggplot(proportion, aes(x="", y=freq, fill=Var1)) + geom_bar(stat="identity", width=1)+ scale_fill_manual(values = brewer.pal(n = 9, name = "Set3"))
# Convert to pie (polar coordinates) and add labels
pie = pie + coord_polar("y", start=0) + geom_text_repel(aes(label = paste0(Var1,":",round(freq*100), "%")), position = position_stack(vjust = 0.5)) + theme_minimal(base_size = 16) + theme(axis.title = element_blank(), axis.text = element_blank(), panel.grid = element_blank())+NoLegend()
pie
#pie = ggplot(proportion, aes(x=Var1, y=freq,fill=Var1)) + geom_bar(stat="identity", width=1)+ coord_flip()
#pie
}
})
output$pseudo <- renderPlot({
tsne<-Values1$umap
if (input$tsne.type == "Clusters") {
}
else if (input$tsne.type == "Datasets"){
}
else if (input$tsne.type == "Metabolites/Features"){
plf <- data.frame(
id = colnames(Pos_seu()),
class =as.character(Pos_seu()$leiden),
X=Pos_seu()$Pseudotime*-1,
Y=log(as.numeric(Values1$omic[input$tsne.gene,])+1),
cluster=Pos_seu()$ClusterID
)
p1<-ggplot(data=plf,aes(x=X,y=Y))+geom_point(aes(color = class))+geom_smooth(color="black",size=1,span = 1)+ggtitle(paste("Pseudotime of ",input$tsne.gene))+NoLegend()+
xlab('Pseudotime')+ylab("Expression")+theme_classic(base_size = 16) + theme(axis.text.x = element_blank(),axis.ticks=element_blank())+
guides(color=FALSE)
p1+theme(legend.position="bottom")
}
else {
}
})
output$legend.tsne <- renderPlot({
tsne<-Values1$umap
if (input$tsne.type == "Clusters") {
a <- qplot(x = tsne[,1] , y= tsne[,2], color = as.character(Pos_seu()$ClusterID))+ labs(color = "Raw clusters") +
theme(legend.position = "bottom",legend.title=element_text(size=23),
legend.text=element_text(size=22))+guides(fill=guide_legend(ncolumn=6))
legend <- g_legend(a)
grid.newpage()
grid.draw(legend)
}
else if (input$tsne.type == "Datasets"){
a <- qplot(x = tsne[,1] , y= tsne[,2], color = Pos_seu()$ds)+labs(color = "Datasets")+
theme(legend.position = "bottom",legend.title=element_text(size=23),
legend.text=element_text(size=22))+guides(col = guide_legend(nrow = 4))
legend <- g_legend(a)
grid.newpage()
grid.draw(legend)
}
else if (input$tsne.type == "Metabolites/Features"){
plf <- data.frame(
id = colnames(Pos_seu()),
Met = as.numeric(Values1$omic[input$tsne.gene,]),
class =as.factor(Pos_seu()$ds),
X=Pos_seu()$Location_Center_X,
Y=Pos_seu()$Location_Center_Y,
cluster=Pos_seu()$ClusterID
)
qplot(x = X,
y = Y,
geom = "point", color=Met,data=plf,size=I(0.5),shape='.') + facet_wrap(~ class)+ scale_color_gradientn(name =input$tsne.gene, colours = c("black","blue","red","yellow"))+theme_classic(base_size = 16) + theme(axis.text = element_blank(),axis.ticks=element_blank()) +NoLegend()+ggtitle('Spatial Distribution')
}
else {
proportion<-melt(table(Idents(Pos_seu())[dataInput()$scheme]))
proportion<-group_by(proportion, Var1) %>%
tally(value, sort = TRUE) %>%
group_by(Var1 = factor(c(as.character(Var1[1:8]), rep("Other", n() - 8)),
levels = c(as.character(Var1[1:8]), "Other"))) %>%
tally(n) %>% mutate(freq = n / sum(n))
pie = ggplot(proportion, aes(x="", y=freq, fill=Var1)) + geom_bar(stat="identity", width=1)+ scale_fill_manual(name= "Cell types",values = brewer.pal(n = 9, name = "Set3"))
# Convert to pie (polar coordinates) and add labels
#pie = pie + coord_polar("y", start=0) +
#geom_text_repel(aes(label = paste0(Var1,":",round(freq*100), "%")), position = position_stack(vjust = 0.5))
#pie<-pie+theme(legend.position = "bottom",legend.title=element_text(size=16),legend.text=element_text(size=15))
pie<-pie+theme(legend.position = "left",legend.title=element_text(size=16),
legend.text=element_text(size=15))+guides(fill=guide_legend(nrow=5))
legend <- g_legend(pie)
grid.newpage()
grid.draw(legend)
}
})
##TABDE
output$Cell1 = renderUI({
selectizeInput("cells1", "Cell type 1", choices = unname(unique(as.character(Pos_seu()$ClusterID))),multiple = T,options = list(placeholder = 'Select the cell type 1 to compare '))
})
output$Cell2 = renderUI({
selectizeInput("cells2", "Cell type 2", choices = c('All other cell types',unname(unique(as.character(Pos_seu()$ClusterID)))),multiple = T,options = list(placeholder = 'Select the cell type 2 to compare '))
})
output$Cond1 = renderUI({
selectizeInput("cond1", "Condition 1", choices = unname(unique(Pos_seu()$Condition)),multiple = T,options = list(placeholder = 'Select the conditions to compare '),selected=unname(unique(Pos_seu()$Condition)))
})
output$Cond2 = renderUI({
selectizeInput("cond2", "Condition 2", choices = unname(unique(Pos_seu()$Condition)),multiple = T,options = list(placeholder = 'Select the conditions to compare '),selected=unname(unique(Pos_seu()$Condition)))
})
CellsInput <- eventReactive(input$calculate, {
if(input$AssayDE=='Metabolites')
{
assay='RNA'
slot='data'
}
else
{
assay='AllFeat'
slot='counts'
}
# if(input$cond1=='All Conditions')
# {cond1=unique(Pos_seu()$Condition)}
# if(input$cond2=='All Conditions'){cond2=unique(Pos_seu()$Condition)}
#
#
temp<-Pos_seu()
if(input$cells2=="All other cell types"){
ident2=unique(Pos_seu()$ClusterID)[(!unique(Pos_seu()$ClusterID) %in% (input$cells1))]
id1<-rownames(temp@meta.data)[temp@meta.data$Condition %in% input$cond1 & temp@meta.data$ClusterID %in% input$cells1 ]
Idents(object = temp, cells = id1) <- "Ident1"
id2<-rownames(temp@meta.data)[temp@meta.data$Condition %in% input$cond2 & temp@meta.data$ClusterID %in% ident2 ]
Idents(object = temp, cells = id2) <- "Ident2"
Markers<-FindMarkers(temp,assay = assay,slot=slot,ident.1 = "Ident1", ident.2 = "Ident2",logfc.threshold = 0,min.pct = 0,pseudocount.use = 1)
}
else{
#print(input$cond1)
id1<-rownames(temp@meta.data)[temp@meta.data$Condition %in% input$cond1 & temp@meta.data$ClusterID %in% input$cells1 ]
#print(id1)
Idents(object = temp, cells = id1) <- "Ident1"
id2<-rownames(temp@meta.data)[temp@meta.data$Condition %in% input$cond2 & temp@meta.data$ClusterID %in% input$cells2 ]
Idents(object = temp, cells = id2) <- "Ident2"
#print(levels(Idents(temp)))
Markers<-FindMarkers(temp,assay = assay,slot=slot,ident.1 = "Ident1", ident.2 = "Ident2",logfc.threshold = 0,min.pct = 0,pseudocount.use=0.1)
}
rm(temp)
return(Markers)
})
output$Voldano.pl <- renderPlot({
Cell1VsCell2<-CellsInput()
Cell1VsCell2$gene<-rownames(Cell1VsCell2)
Cell1VsCell2 = mutate(Cell1VsCell2, sig=ifelse(Cell1VsCell2$p_val_adj<0.05, "FDR<0.05", "Not Sig"))
top<-rbind(top_n(x = Cell1VsCell2,wt=(avg_logFC),n = 5),top_n(x = Cell1VsCell2,wt=-avg_logFC,n = 5))
p = ggplot(Cell1VsCell2, aes(avg_logFC, -log10(p_val))) +
geom_point(aes(col=sig)) +
scale_color_manual(values=c("red", "black"))+geom_text_repel(data=top, aes(label=gene),box.padding = 0.5)+
theme( plot.title=element_text(size=16,face="bold"),
axis.text=element_text(size=18),
axis.title=element_text(size=20,face="bold"),legend.text=element_text(size=18),legend.title=element_text(size=20,face="bold"))
p
})
output$tableDE <- renderDT({
out <-CellsInput()
out$gene<-rownames(out)
#out<-filter(out,p_val_adj<0.05)
data.frame("Gene/AB" = out$gene, "Adjusted P-value (FDR)" = formatC(out$p_val_adj, format = "e", digits = 1), "Log2 FC"=round(out$avg_logFC,digits = 3))
})
output$downloadData <- downloadHandler(
filename = 'DE.csv',
content = function(file) {
out <-CellsInput()
out$gene<-rownames(out)
out<-filter(out,p_val_adj<0.05)
tabledown<-data.frame("Gene/AB" = out$gene, "Adjusted P-value (FDR)" = formatC(out$p_val_adj, format = "e", digits = 1), "Log2 FC"=round(out$avg_logFC,digits = 3))
write.csv(tabledown, file, row.names = FALSE)
}
)
})
#
# This is the user-interface definition of a Shiny web application. You can
# run the application by clicking 'Run App' above.
#