| @ -0,0 +1,592 @@ | |||
| library(shiny) | |||
| library(ggplot2) | |||
| library(reshape2) | |||
| library(openxlsx) | |||
| library(dplyr) | |||
| library(car) | |||
| library(ggbeeswarm) | |||
| library(gtools) | |||
| library(gridExtra) | |||
| source("../../funcions.R") | |||
| library(survminer) | |||
| library(survival) | |||
| # Define UI for application | |||
| ui <- fluidPage( | |||
| #Navbar | |||
| navbarPage("Seguimiento in vivos", | |||
| tabPanel("Diseño", | |||
| sidebarPanel( | |||
| fileInput(inputId = "file_sizes", label = "Hoja de tamaños", multiple = F), | |||
| selectInput(inputId = "measure_sys", "Sistema de medida", selected = "L-W-D", choices = c("L-W-D","Min-Max","Absorbance")), | |||
| uiOutput('ncages'), | |||
| uiOutput('lowcut'), | |||
| uiOutput('upcut'), | |||
| uiOutput('goButton'), | |||
| uiOutput('iterations'), | |||
| downloadButton("downloadData", "Descargar Excel") | |||
| ), | |||
| mainPanel( | |||
| plotOutput("firstPlot"), | |||
| plotOutput("distPlot") | |||
| ) | |||
| ), | |||
| tabPanel("Análisis", | |||
| sidebarPanel( | |||
| fileInput(inputId = "file_analy", label = "Hoja de análisis", multiple = F), | |||
| selectInput(inputId = "vacc", "Experimento de Vacunación", selected = "No", choices = c("Sí","No")), | |||
| sliderInput("cutoff", "Cutoff para Survival", min=100, max=1500, step=50, value=750), | |||
| checkboxInput("filter_stats","Filtrar Estadística") | |||
| ), | |||
| mainPanel( | |||
| h3('Ratones'), | |||
| tableOutput('ntable'), | |||
| h3('Cinéticas'), | |||
| plotOutput('cin_group'), | |||
| plotOutput('cin_indiv'), | |||
| plotOutput('survival', height="800px"), | |||
| h3('Estadística'), | |||
| verbatimTextOutput('stats'), | |||
| tableOutput('tab_stats') | |||
| )), | |||
| tabPanel("Exportar", | |||
| sidebarPanel(width=2, | |||
| h3('Seleccionar figura'), | |||
| selectInput("fig_id", "", selected="", choices=c("Cinética Grupo", "Cinética Individual", "Survival")), | |||
| h3('Formato'), | |||
| sliderInput("width", "Ancho", min=1000, max=20000, step=1000, value=10000), | |||
| sliderInput("height", "Altura", min=1000, max=20000, step=1000, value=6000), | |||
| textInput("colors", label="Colors", value=""), | |||
| sliderInput("errorbar-width", "% Ancho errorbars", min=0.05, max=1, step=0.05, value=0.05), | |||
| sliderInput("point-size", "Tamaño puntos", min=1, max=10, step=1, value=3), | |||
| sliderInput("font-size", "Tamaño textos", min=5, max=30, step=1, value=11), | |||
| checkboxInput(inputId = "legend", label = "Mostrar llegenda", value = T), | |||
| selectInput("theme", "Seleccionar Tema", selected="BW", choices=c("BW", "Default", "Classic")), | |||
| downloadButton("downloadPicture", "Exportar") | |||
| ), | |||
| mainPanel( | |||
| uiOutput("expPlotUI") | |||
| ) | |||
| ) | |||
| ) | |||
| ) | |||
| # Define server logic required to draw a histogram | |||
| server <- function(input, output) { | |||
| # Diseño | |||
| dades<-reactiveValues() | |||
| dades$taula<-NULL | |||
| dades$groups<-NULL | |||
| dades$db<-NULL | |||
| observe({ | |||
| if (!is.null(input$file_sizes)){ | |||
| dades$taula<-read.xlsx(input$file_sizes$datapath, sheet = 1) | |||
| dades$groups<-read.xlsx(input$file_sizes$datapath, sheet = 2)[,1] | |||
| } | |||
| }) | |||
| output$firstPlot <- renderPlot({ | |||
| observeEvent(dades$taula, {}) | |||
| if (!is.null(dades$taula)){ | |||
| ggplot(dades$taula, aes(x="1", y=Volumen))+geom_quasirandom(width=0.2) | |||
| } | |||
| }) | |||
| output$iterations<-renderUI({ | |||
| if (!is.null(dades$taula)){ | |||
| sliderInput("iterations", "Iteraciones", min=100, max=2000, step=100, value=100) | |||
| } | |||
| }) | |||
| output$lowcut<-renderUI({ | |||
| if (!is.null(dades$taula)){ | |||
| sliderInput("lowcut", "Corte inferior", min=0, max=1000, step=5, value=0) | |||
| } | |||
| }) | |||
| output$upcut<-renderUI({ | |||
| if (!is.null(dades$taula)){ | |||
| sliderInput("upcut", "Corte superior", min=0, max=1000, step=5, value=400) | |||
| } | |||
| }) | |||
| output$goButton<-renderUI({ | |||
| if (!is.null(dades$taula)){ | |||
| actionButton("goButton", "Selecciona") | |||
| } | |||
| }) | |||
| output$ncages<-renderUI({ | |||
| if (is.null(dades$taula)){ | |||
| sliderInput("ncages", "Cajas", min=1, max=10, value=1) | |||
| } | |||
| }) | |||
| grafic<-eventReactive(input$goButton,{ | |||
| df<-dades$taula | |||
| up_cuttof<-input$upcut | |||
| low_cuttof<-input$lowcut | |||
| df<-df[df$Volumen < up_cuttof & df$Volumen > low_cuttof,] | |||
| df["Mouse"]<-gsub("[a-zA-Z]", "", df$MouseID) | |||
| s<-shapiro.test(df$Volumen)[[2]] | |||
| ngroup<-length(dades$groups) | |||
| ind.list<-list() | |||
| pval.list<-list() | |||
| lvn.list<-list() | |||
| test.list<-list() | |||
| for (data in 1:input$iterations){ | |||
| interr=T | |||
| while(interr == T){ | |||
| ind<-sample(rep(dades$groups, each=7), length(unique(df$Mouse))) | |||
| df_temp<-merge(df, data.frame("Mouse"=unique(df$Mouse), "group"=as.factor(ind))) | |||
| interr<-any(table(df_temp$group) < floor(nrow(df_temp)/5) | table(df_temp$group) > ceiling(nrow(df_temp)/5)) | |||
| } | |||
| ind.list[[data]]<-df_temp[,c("MouseID","group")] | |||
| lvn.list[data]<-leveneTest(Volumen ~ group, data = df_temp[,3:4])[[2]][1] | |||
| if (s < 0.05){ | |||
| k<-kruskal.test(df_temp$Volumen,df_temp$group) | |||
| test.list[data]<-k[[1]][1] | |||
| pval.list[data]<-k[[3]][1] | |||
| }else{ | |||
| res.aov<-aov(Volumen~group, data=df_temp) | |||
| pval.list[data]<-summary(res.aov)[[1]][[5]][1] | |||
| test.list[data]<-summary(res.aov)[[1]][[4]][1] | |||
| } | |||
| } | |||
| index<-which(unlist(lvn.list) == min(unlist(lvn.list)[which(unlist(pval.list) %in% sort(unlist(pval.list), decreasing = T)[1:20])])) | |||
| df_def<-merge(df, ind.list[[index]]) | |||
| dades$db<-df_def | |||
| ggplot(df_def, aes(group, Volumen))+ | |||
| geom_boxplot(outlier.alpha = F)+ | |||
| geom_jitter(width=0.25)+ | |||
| geom_point(stat="summary", color="blue", size=3)+ | |||
| lims(y=c(0,max(df_def$Volumen)+10)) | |||
| }) | |||
| output$distPlot <- renderPlot({ | |||
| observeEvent(dades$taula, {}) | |||
| if (!is.null(dades$taula)){ | |||
| grafic() | |||
| } | |||
| }) | |||
| output$downloadData <- downloadHandler( | |||
| filename = function() { | |||
| paste("invivo", ".xlsx", sep="") | |||
| }, | |||
| content = function(file){ | |||
| ncages<-input$ncages | |||
| nrat_cage<-5 | |||
| id_tumors<-c("L","R") | |||
| timepoint<-c(7,10,13,16,19,22,25) | |||
| if (!is.null(input$file_sizes)){ | |||
| template<-expand.grid(dades$db$MouseID, timepoint) | |||
| colnames(template)<-c("MouseID", "Timepoint") | |||
| template<-template[order(template$Timepoint, template$MouseID),] | |||
| template<-merge(template, dades$db[c("MouseID", "group")]) | |||
| if (input$measure_sys == "L-W-D"){ | |||
| template<-rbind(template, template, template) | |||
| template<-template[order(template$Timepoint, template$MouseID),] | |||
| template["TS"]<-rep(c("TS-Length", "TS-Width", "TS-Deep"), nrow(template)/3) | |||
| dtemplate<-dcast(template, MouseID+group+TS~Timepoint) | |||
| dtemplate<-dtemplate[mixedorder(as.character(dtemplate$MouseID)),] | |||
| } | |||
| if (input$measure_sys == "Min-Max"){ | |||
| template<-rbind(template, template) | |||
| template<-template[order(template$Timepoint, template$MouseID),] | |||
| template["DPV"]<-rep(c("Major", "Minor"), nrow(template)/2) | |||
| dtemplate<-dcast(template, MouseID+group+DPV~Timepoint) | |||
| dtemplate<-dtemplate[mixedorder(as.character(dtemplate$MouseID)),] | |||
| } | |||
| dtemplate<-dtemplate %>% add_column(.after="MouseID", "ID tumor"=dtemplate$MouseID)%>% rename(`ID animal`=MouseID) | |||
| dtemplate["ID tumor"]<-gsub("[[:digit:]]","",dtemplate$`ID tumor`) | |||
| dtemplate["ID animal"]<-gsub("[LR]","",dtemplate$`ID animal`) | |||
| dtemplate[,5:ncol(dtemplate)]<-"" | |||
| }else{ | |||
| template<-expand.grid(LETTERS[1:ncages], 1:5, id_tumors, timepoint)[,-2] | |||
| colnames(template)<-c("Cage", "ID tumor", "Timepoint") | |||
| nids<-length(id_tumors)*length(timepoint) | |||
| template[order(template$Cage),"ID animal"]<-rep(1:(nrow(template)/(nids)), each=nids) | |||
| template<-template[order(template$Timepoint, template$Cage, template$`ID animal`),] | |||
| template["Group"]<-"" | |||
| if (input$measure_sys == "L-W-D"){ | |||
| template<-rbind(template, template, template) | |||
| template<-template[order(template$Timepoint, template$Cage, template$`ID animal`, template$`ID tumor`),] | |||
| template["TS"]<-rep(c("TS-Length", "TS-Width", "TS-Deep"), nrow(template)/3) | |||
| dtemplate<-dcast(template, Cage+`ID animal`+`ID tumor`+Group+TS~Timepoint) | |||
| } | |||
| if (input$measure_sys == "Min-Max"){ | |||
| template<-rbind(template, template) | |||
| template<-template[order(template$Timepoint, template$Cage, template$`ID animal`, template$`ID tumor`),] | |||
| template["DPV"]<-rep(c("Major", "Minor"), nrow(template)/2) | |||
| dtemplate<-dcast(template, Cage+`ID animal`+`ID tumor`+Group+DPV~Timepoint) | |||
| } | |||
| dtemplate[,6:ncol(dtemplate)]<-"" | |||
| } | |||
| write.xlsx(dtemplate,file) | |||
| } | |||
| ) | |||
| # Análisis | |||
| analysis<-reactiveValues() | |||
| analysis$taula<-NULL | |||
| analysis$taula_def<-NULL | |||
| observe({ | |||
| if (!is.null(input$file_analy)){ | |||
| analysis$taula<-read.xlsx(input$file_analy$datapath, sheet = 1, check.names = F, sep.names = " ") | |||
| } | |||
| }) | |||
| output$ntable<-renderTable({ | |||
| if (!is.null(input$file_analy)){ | |||
| observeEvent(analysis$taula, {}) | |||
| stattest<-"dunn" | |||
| oneside<-"" | |||
| cutoff<-750 | |||
| table<-analysis$taula | |||
| if ("ID.animal" %in% colnames(table)){table<-rename(table, "ID animal"=`ID.animal`)} | |||
| if ("ID" %in% colnames(table)){table<-rename(table, "ID animal"=ID)} | |||
| if ("ID.tumor" %in% colnames(table)){table<-rename(table, "ID tumor"=`ID.tumor`)} | |||
| # table[table$ID.tumor == "R","0"]<-NA | |||
| col_nodays<-c("ID", "Cage","Group", "ID.animal","ID animal", "ID.tumor", "ID tumor", "TS","DPV", "Absorbance") | |||
| if (length(grep(0, colnames(table)[!colnames(table) %in% col_nodays])) == 0){ | |||
| table["0"]<-0 | |||
| } | |||
| table<-melt(table, id=colnames(table)[colnames(table) %in% col_nodays], variable.name = "Timepoint") | |||
| table$Timepoint<-gsub("[A-Za-z ]","",table$Timepoint) | |||
| if ("DPV" %in% colnames(table)){ | |||
| table<-dcast(table, Cage+`ID animal`+`ID tumor`+Group+Timepoint~DPV, value.var = "value") | |||
| table$Major<-table$Major/1000 | |||
| table$Minor<-table$Minor/1000 | |||
| table["Volume"]<-((table$Major*table$Minor*table$Minor)*(pi/6))*1000 | |||
| } | |||
| if ("TS" %in% colnames(table)){ | |||
| table<-dcast(table, Cage+`ID animal`+`ID tumor`+Group+Timepoint~TS, value.var = "value") | |||
| table["Volume"]<-table$`TS-Deep`*table$`TS-Length`*table$`TS-Width`*pi/6 | |||
| } | |||
| if (!"Volume" %in% colnames(table)){table<-rename(table, "Volume"=value)} | |||
| table<-table %>% filter(!is.na(Group)) | |||
| table$Timepoint<-factor(table$Timepoint, levels=mixedsort(as.numeric(as.character(unique(table$Timepoint))))) | |||
| analysis$taula_def<-table | |||
| table_plot<-dcast(dcast(table %>% filter(!is.na(Volume)), `ID animal`+Group+Timepoint~., value.var = "Volume", fun.aggregate = mean), Group~Timepoint) | |||
| table_plot | |||
| } | |||
| }) | |||
| output$cin_group<-renderPlot({ | |||
| if (!is.null(input$file_analy) & !is.null(analysis$taula_def)){ | |||
| observeEvent(analysis$taula_def, {}) | |||
| table<-analysis$taula_def | |||
| if (input$vacc == "Sí"){ | |||
| ggplot(table, aes(as.numeric(as.character(Timepoint)), Volume, color=Group, group=Group))+ | |||
| geom_errorbar(stat="summary", width=0.05)+ | |||
| geom_line(stat="summary")+ | |||
| geom_point(stat="summary")+ | |||
| facet_grid(factor(`ID tumor`, labels = c("Vaccination", "Rechallenge"))~., scale="free_y")+ | |||
| labs(x="Days after tumor challenge")+ | |||
| scale_y_continuous(expand = expansion(mult = c(0,0.05)))+ | |||
| scale_x_continuous(expand = expansion(mult = c(0,0.05)), limits = c(0, (round(max(as.numeric(as.character(table$Timepoint))) / 5)+1)*5))+ | |||
| theme_bw() | |||
| }else{ | |||
| ggplot(table, aes(Timepoint, Volume, color=Group, group=Group))+ | |||
| geom_errorbar(stat="summary",width=0.05)+ | |||
| geom_line(stat="summary")+ | |||
| geom_point(stat="summary")+ | |||
| labs(x="Days after tumor challenge")+ | |||
| scale_y_continuous(expand = expansion(mult = c(0,0.05)))+ | |||
| theme_bw()+ | |||
| theme(axis.text.x=element_text(angle=45, hjust=1)) | |||
| } | |||
| } | |||
| }) | |||
| output$cin_indiv<-renderPlot({ | |||
| if (!is.null(input$file_analy) & !is.null(analysis$taula_def)){ | |||
| observeEvent(analysis$taula_def, {}) | |||
| table<-analysis$taula_def | |||
| if (input$vacc == "Sí"){ | |||
| ggplot(table, aes(as.numeric(as.character(Timepoint)), Volume, color=Group, group=`ID animal`))+ | |||
| # geom_errorbar(stat="summary", width=0.05)+ | |||
| geom_line()+ | |||
| geom_point()+ | |||
| scale_y_continuous(expand = expansion(mult = c(0,0.05)))+ | |||
| scale_x_continuous(expand = expansion(mult = c(0,0.05)), limits = c(0, (round(max(as.numeric(as.character(table$Timepoint))) / 5)+1)*5))+ | |||
| facet_grid(factor(`ID tumor`, labels = c("Vaccination", "Rechallenge"))~Group, scale="free_y")+ | |||
| labs(x="Days after tumor challenge")+ | |||
| theme_bw() | |||
| }else{ | |||
| ggplot(table, aes(Timepoint, Volume, color=Group, group=`ID animal`))+ | |||
| # geom_errorbar(stat="summary", width=0.05)+ | |||
| geom_line()+ | |||
| geom_point()+ | |||
| scale_y_continuous(expand = expansion(mult = c(0,0.05)))+ | |||
| # scale_x_continuous(expand = expansion(mult = c(0,0.05)), limits = c(0, (round(max(as.numeric(as.character(table$Timepoint))) / 5)+1)*5))+ | |||
| facet_wrap(.~Group)+ | |||
| labs(x="Days after tumor challenge")+ | |||
| theme_bw()+ | |||
| theme(axis.text.x=element_text(angle=45, hjust=1)) | |||
| } | |||
| } | |||
| }) | |||
| output$survival<-renderPlot({ | |||
| if (!is.null(input$file_analy) & !is.null(analysis$taula_def)){ | |||
| observeEvent(analysis$taula_def, {}) | |||
| table<-analysis$taula_def | |||
| if (input$vacc == "Sí"){ | |||
| g<-list() | |||
| for (side in c("L","R")){ | |||
| tableR<-filter(table, `ID tumor` == side) %>% filter(!is.na(Volume)) | |||
| endtime<-dcast(tableR %>% filter(Volume < cutoff), Cage+`ID animal`+`ID tumor`+Group~., value.var = "Timepoint", fun.aggregate = function(x){max(as.numeric(as.character(x)))}) %>% rename("end"=".") | |||
| endtime["Dead"]<-dcast(tableR, Cage+`ID animal`+`ID tumor`+Group~., value.var = "Volume", fun.aggregate = function(x){max(as.numeric(as.character(x)))}) %>% pull(".") > input$cutoff | |||
| table_tumor<<-endtime | |||
| g[side]<-ggsurvplot(survfit(Surv(table_tumor$end, table_tumor$Dead) ~ table_tumor$Group, data=table_tumor), | |||
| pval = T, pval.method = T, | |||
| title = side, | |||
| # legend.labs = paste(c("< median", ">= median"), "MICA"), | |||
| ggtheme=theme_classic(base_size=15) | |||
| # conf.int = TRUE, | |||
| # Add risk table | |||
| # risk.table = TRUE, | |||
| # tables.height = 0.2, | |||
| # tables.theme = theme_cleantable(), | |||
| # Color palettes. Use custom color: c("#E7B800", "#2E9FDF"), | |||
| # or brewer color (e.g.: "Dark2"), or ggsci color (e.g.: "jco") | |||
| # palette = c("#E7B800", "#2E9FDF") | |||
| ) | |||
| } | |||
| do.call(grid.arrange, g) | |||
| }else{ | |||
| tableR<-table %>% filter(!is.na(Volume)) | |||
| endtime<-dcast(tableR %>% filter(Volume < cutoff), `ID animal`+Group~., value.var = "Timepoint", fun.aggregate = function(x){max(as.numeric(as.character(x)))}) %>% rename("end"=".") | |||
| endtime["Dead"]<-dcast(tableR, `ID animal`+Group~., value.var = "Volume", fun.aggregate = function(x){max(as.numeric(as.character(x)))}) %>% pull(".") > input$cutoff | |||
| table_tumor<<-endtime | |||
| g<-ggsurvplot(survfit(Surv(table_tumor$end, table_tumor$Dead) ~ table_tumor$Group, data=table_tumor), | |||
| pval = T, pval.method = T, | |||
| # legend.labs = paste(c("< median", ">= median"), "MICA"), | |||
| ggtheme=theme_classic(base_size=15) | |||
| # palette = c("#E7B800", "#2E9FDF") | |||
| ) | |||
| g | |||
| } | |||
| } | |||
| }) | |||
| output$stats<-renderPrint({ | |||
| stattest<-"dunn" | |||
| oneside<-"" | |||
| cutoff<-750 | |||
| if (!is.null(input$file_analy) & !is.null(analysis$taula_def)){ | |||
| observeEvent(analysis$taula_def, {}) | |||
| table<-analysis$taula_def | |||
| if (input$vacc == "No"){ | |||
| table<-filter(table, !is.na(Volume)) | |||
| summary(aov(Volume~Group+Timepoint+Error(`ID animal`), data=table)) | |||
| }else{ | |||
| for (side in c("L","R")){ | |||
| tableR<-filter(table, `ID tumor` == side) %>% filter(!is.na(Volume)) | |||
| if (length(unique(tableR$Volume)) > 1 & length(unique(tableR$Timepoint)) > 1){ | |||
| print(paste0("Side: ",side)) | |||
| # print(summary(aov(Volume~Group+Timepoint+Error(paste0(ID animal,Cage)), data=tableR))) | |||
| print(summary(aov(Volume~Group+Timepoint+Error(`ID animal`), data=tableR))) | |||
| } | |||
| } | |||
| } | |||
| } | |||
| }) | |||
| output$tab_stats<-renderTable({ | |||
| stattest<-"dunn" | |||
| oneside<-"" | |||
| cutoff<-750 | |||
| if (!is.null(input$file_analy) & !is.null(analysis$taula_def)){ | |||
| table<-analysis$taula_def | |||
| table_stats<-list() | |||
| if (input$vacc == "No"){ | |||
| table<-table%>%filter(!is.na(Volume)) | |||
| if (length(unique(table$Volume)) > 1){ | |||
| table_stats<-multi_stats(table, "Volume", "Timepoint", "Group", stat.test=stattest) | |||
| } | |||
| table_kw<-as.data.frame(matrix(nrow=0, ncol=2)) | |||
| for (point in unique(table$Timepoint)){ | |||
| len_group<-length(unique(table %>% filter(Timepoint == point) %>% pull(Group))) | |||
| if (len_group > 1){ | |||
| table_kw<-rbind(table_kw, data.frame(point,kruskal.test(table %>% filter(Timepoint == point) %>% pull(Volume), table %>% filter(Timepoint == point) %>% pull(Group))[3][[1]])) | |||
| } | |||
| } | |||
| colnames(table_kw)<-c("Timepoint", "KW-p.val") | |||
| table_stats<-merge(table_stats, table_kw) | |||
| }else{ | |||
| for (side in c("L","R")){ | |||
| tableR<-filter(table, `ID tumor` == side) %>% filter(!is.na(Volume)) | |||
| if (length(unique(tableR$Volume)) > 1){ | |||
| table_stats[[side]]<-multi_stats(tableR, "Volume", "Timepoint", "Group", stat.test=stattest) | |||
| } | |||
| table_kw<-as.data.frame(matrix(nrow=0, ncol=2)) | |||
| for (point in unique(tableR$Timepoint)){ | |||
| len_group<-length(unique(tableR %>% filter(Timepoint == point) %>% pull(Group))) | |||
| if (len_group > 1){ | |||
| table_kw<-rbind(table_kw, data.frame(point,kruskal.test(tableR %>% filter(Timepoint == point) %>% pull(Volume), tableR %>% filter(Timepoint == point) %>% pull(Group))[3][[1]])) | |||
| } | |||
| } | |||
| colnames(table_kw)<-c("Timepoint", "KW-p.val") | |||
| table_stats[[side]]<-merge(table_stats[[side]], table_kw) | |||
| } | |||
| } | |||
| table_stats_def<-bind_rows(table_stats, .id = "ID tumor") | |||
| if (input$filter_stats == T){ | |||
| table_stats_def %>% filter(p.adj < 0.05) | |||
| }else{ | |||
| table_stats_def | |||
| } | |||
| } | |||
| }) | |||
| output$expPlotUI<- renderUI({ | |||
| observeEvent(analysis$taula_def, {}) | |||
| if (!is.null(input$file_analy) & !is.null(analysis$taula_def)){ | |||
| plotOutput("expPlot", width=paste0(input$width/10,"px"), height = paste0(input$height/10, "px")) | |||
| } | |||
| }) | |||
| output$expPlot <- renderPlot({ | |||
| observeEvent(analysis$taula_def, {}) | |||
| if (!is.null(input$file_analy) & !is.null(analysis$taula_def)){ | |||
| table<-analysis$taula_def | |||
| if (input$fig_id %in% c("Cinética Grupo", "Cinética Individual")){ | |||
| if (input$fig_id == "Cinética Grupo"){ | |||
| if (input$vacc == "Sí"){ | |||
| g<-ggplot(table, aes(as.numeric(as.character(Timepoint)), Volume, color=Group, group=Group))+ | |||
| scale_x_continuous(expand = expansion(mult = c(0,0.05)), limits = c(0, (round(max(as.numeric(as.character(table$Timepoint))) / 5)+1)*5))+ | |||
| facet_grid(factor(`ID tumor`, labels = c("Vaccination", "Rechallenge"))~., scale="free_y")+ | |||
| theme_bw() | |||
| }else{ | |||
| g<-ggplot(table, aes(Timepoint, Volume, color=Group, group=Group))+ | |||
| theme_bw() | |||
| } | |||
| } | |||
| if (input$fig_id == "Cinética Individual"){ | |||
| if (input$vacc == "Sí"){ | |||
| g<-ggplot(table, aes(as.numeric(as.character(Timepoint)), Volume, color=Group, group=Group))+ | |||
| scale_x_continuous(expand = expansion(mult = c(0,0.05)), limits = c(0, (round(max(as.numeric(as.character(table$Timepoint))) / 5)+1)*5))+ | |||
| facet_grid(factor(`ID tumor`, labels = c("Vaccination", "Rechallenge"))~Group, scale="free_y")+ | |||
| theme_bw() | |||
| }else{ | |||
| g<-ggplot(table, aes(Timepoint, Volume, color=Group, group=`ID animal`))+ | |||
| facet_wrap(.~Group)+ | |||
| theme_bw() | |||
| } | |||
| } | |||
| g<-g+geom_errorbar(stat="summary", width=input$`errorbar-width`)+ | |||
| geom_line(stat="summary")+ | |||
| geom_point(stat="summary", size=input$`point-size`)+ | |||
| labs(x="Days after tumor challenge")+ | |||
| scale_y_continuous(expand = expansion(mult = c(0,0.05))) | |||
| if (input$theme == "BW"){ | |||
| g<-g+theme_bw(base_size = input$`font-size`) | |||
| } | |||
| if (input$theme == "Classic"){ | |||
| g<-g+theme_classic(base_size = input$`font-size`) | |||
| } | |||
| if (input$theme == "Default"){ | |||
| g<-g+theme_gray(base_size = input$`font-size`) | |||
| } | |||
| # g<-g+theme(axis.text.x=element_text(angle=45, hjust=1)) | |||
| if (input$legend == F){ | |||
| g<-g+guides(color=FALSE, fill=FALSE) | |||
| } | |||
| if (input$colors != ""){ | |||
| v_col<-strsplit(input$colors, ",")[[1]] | |||
| g<-g+scale_color_manual(values=v_col)+ | |||
| scale_fill_manual(values=v_col) | |||
| } | |||
| }else{ | |||
| gg_color_hue <- function(n, l=65) { | |||
| hues <- seq(15, 375, length=n+1) | |||
| hcl(h=hues, l=l, c=100)[1:n] | |||
| } | |||
| if (input$vacc == "Sí"){ | |||
| g<-list() | |||
| count<-1 | |||
| for (side in c("L","R")){ | |||
| tableR<-filter(table, `ID tumor` == side) %>% filter(!is.na(Volume)) | |||
| endtime<-dcast(tableR %>% filter(Volume < cutoff), Cage+`ID animal`+`ID tumor`+Group~., value.var = "Timepoint", fun.aggregate = function(x){max(as.numeric(as.character(x)))}) %>% rename("end"=".") | |||
| endtime["Dead"]<-dcast(tableR, Cage+`ID animal`+`ID tumor`+Group~., value.var = "Volume", fun.aggregate = function(x){max(as.numeric(as.character(x)))}) %>% pull(".") > input$cutoff | |||
| table_tumor<-endtime | |||
| if (input$colors != ""){ | |||
| col<-input$colors | |||
| }else{ | |||
| col<-gg_color_hue(length(unique(endtime$Group))) | |||
| } | |||
| g[[count]]<-ggsurvplot(survfit(Surv(table_tumor$end, table_tumor$Dead) ~ table_tumor$Group, data=table_tumor), | |||
| pval = T, pval.method = T, | |||
| title = side, | |||
| # legend.labs = paste(c("< median", ">= median"), "MICA"), | |||
| ggtheme=theme_classic(base_size=input$`font-size`), | |||
| palette = col | |||
| ) | |||
| count<-count+1 | |||
| } | |||
| g_surv_vacc<-g | |||
| }else{ | |||
| if (input$colors != ""){ | |||
| col<-input$colors | |||
| }else{ | |||
| col<-gg_color_hue(length(unique(table_tumor$Group))) | |||
| } | |||
| tableR<-table %>% filter(!is.na(Volume)) | |||
| endtime<-dcast(tableR %>% filter(Volume < cutoff), `ID animal`+Group~., value.var = "Timepoint", fun.aggregate = function(x){max(as.numeric(as.character(x)))}) %>% rename("end"=".") | |||
| endtime["Dead"]<-dcast(tableR, `ID animal`+Group~., value.var = "Volume", fun.aggregate = function(x){max(as.numeric(as.character(x)))}) %>% pull(".") > input$cutoff | |||
| table_tumor<-endtime | |||
| g<-ggsurvplot(survfit(Surv(table_tumor$end, table_tumor$Dead) ~ table_tumor$Group, data=table_tumor), | |||
| pval = T, pval.method = T, | |||
| # legend.labs = paste(c("< median", ">= median"), "MICA"), | |||
| ggtheme=theme_classic(base_size=input$`font-size`), | |||
| palette = col | |||
| ) | |||
| } | |||
| } | |||
| if (input$vacc == "Sí" & input$fig_id == "Survival"){ | |||
| dades$plot<<-g_surv_vacc | |||
| arrange_ggsurvplots(g, nrow=2, ncol=1) | |||
| }else{ | |||
| dades$plot<<-g | |||
| g | |||
| } | |||
| } | |||
| }, res=72) | |||
| output$downloadPicture <- downloadHandler( | |||
| filename = function() { | |||
| paste("Figura", ".png", sep="") | |||
| }, | |||
| content = function(file){ | |||
| # tempReport <- file.path(tempdir(), "elispots.Rmd") | |||
| # file.copy("elispots.Rmd", tempReport, overwrite = TRUE) | |||
| png(file, width = input$width, height=input$height, units = "px", res=720) | |||
| if (input$fig_id == "Survival"){ | |||
| if (input$vacc == "Sí"){ | |||
| arrange_ggsurvplots(dades$plot, nrow=2, ncol=1) | |||
| }else{ | |||
| arrange_ggsurvplots(list(dades$plot), ncol=1) | |||
| } | |||
| }else{plot(dades$plot)} | |||
| dev.off() | |||
| }) | |||
| } | |||
| # Run the application | |||
| shinyApp(ui = ui, server = server) | |||