Spaces:
Sleeping
Sleeping
| create_boxplot <- function(data, x_var, y_var, col, alpha, size, ylab_text, ggtitle_text) { | |
| p <- ggplot(data,aes_string(x = x_var, y = y_var, fill = x_var)) + | |
| geom_boxplot(color = "black", lwd = 1, alpha = alpha) + | |
| ggbeeswarm::geom_beeswarm(aes(text = name), dodge.width = 0.1, | |
| cex = 0.1, | |
| shape = 21, | |
| size = size) + | |
| ylab(ylab_text) + | |
| ggtitle(paste(ggtitle_text, "", sep = "")) + | |
| scale_fill_manual(values = unlist(col)) | |
| p | |
| } | |
| process_boxplot <- function(input,yval,dataa,col) { | |
| y <- yval %>% as.character() | |
| p <- create_boxplot(dataa, input$w, y, col, input$alpha, input$size, input$yAxisLabel, y) | |
| if (input$q != "" && input$pvaluecheck == TRUE) { | |
| tukey_result <- process_tukey_result(input,y,input$q,p,dataa,0.05,input$Fontsize) | |
| p <- p + add_pvalue(tukey_result, remove.bracket = TRUE, bracket.size = 0.000001, label = "{symbol}", tip.length = 0, | |
| label.size = tukey_result$size, inherit.aes = FALSE,y.position = tukey_result$y.position_boxplot) + scale_y_continuous( | |
| limits = c(min(tukey_result$y.min.position), (max(tukey_result$y.position_boxplot) + max(tukey_result$y.position_boxplot) / 30)) | |
| ) | |
| } | |
| p <- p + theme_classic() + theme( | |
| axis.text.x = element_text(angle = 90, hjust = 1), | |
| axis.title.x = element_blank(), | |
| aspect.ratio = 0.75, | |
| text = element_text(size = input$Fontsize) | |
| ) | |
| ggplotly(p,tooltip = c("name","x")) | |
| } | |
| process_boxplot_diagram <- function(input,yval,dataa,col) { | |
| y <- yval %>% as.character() | |
| p <- create_boxplot(dataa, input$w, y, col, input$alpha, input$size, input$yAxisLabel, y) | |
| p <- p + theme_prism( | |
| base_fontface = "plain", | |
| base_line_size = 0.9, | |
| base_family = "Arial" | |
| ) + | |
| scale_x_discrete( | |
| guide = guide_prism_bracket(width = 0.1), | |
| labels = scales::wrap_format(5) | |
| ) + | |
| theme( | |
| legend.position = "none", | |
| axis.title.x = element_blank(), | |
| aspect.ratio = 1.0, | |
| text = element_text(size = input$Fontsize) | |
| ) | |
| if (input$q != "" && input$pvaluecheck == TRUE) { | |
| tukey_result <- process_tukey_result(input,y,input$q,p,dataa,0.05,input$Fontsize) | |
| p <- p + add_pvalue(tukey_result, remove.bracket = TRUE, bracket.size = 0.000001, label = "{symbol}", tip.length = 0, | |
| label.size = tukey_result$size, inherit.aes = FALSE,y.position = tukey_result$y.position_boxplot) + scale_y_continuous( | |
| limits = c(min(dataa[[y]]), (max(tukey_result$y.position_boxplot) + max(tukey_result$y.position_boxplot) / 30)) | |
| ) | |
| } | |
| p | |
| } | |
| process_action_boxplot <- function(input,dataa,metainfocol,svg_path,col,output) { | |
| withProgress(message = 'Calculation in progress', detail = 'This may take a while...', value = 1, { | |
| startnum <- 1 + metainfocol | |
| for (i in startnum:ncol(dataa)) { | |
| yval <- colnames(dataa)[i] | |
| p <- create_boxplot(dataa, input$w, dataa[[yval]], col, input$alpha, input$size, input$yAxisLabel, "") | |
| p <- p + theme_prism( | |
| base_fontface = "plain", | |
| base_line_size = 0.9, | |
| base_family = "Arial" | |
| ) + | |
| scale_x_discrete( | |
| guide = guide_prism_bracket(width = 0.1), | |
| labels = scales::wrap_format(5) | |
| ) + | |
| theme( | |
| legend.position = "none", | |
| axis.title.x = element_blank(), | |
| aspect.ratio = 1.0, | |
| text = element_text(size = input$Fontsize) | |
| ) | |
| if (input$q != "" && input$pvaluecheck == TRUE) { | |
| tukey_result <- process_tukey_result(input,yval,input$q,p,dataa,0.05,input$Fontsize) | |
| p <- p + add_pvalue(tukey_result, remove.bracket = TRUE, bracket.size = 0.000001, label = "{symbol}", tip.length = 0, | |
| label.size = tukey_result$size, inherit.aes = FALSE,y.position = tukey_result$y.position_boxplot) + scale_y_continuous( | |
| limits = c(min(dataa[[yval]]), (max(tukey_result$y.position_boxplot) + max(tukey_result$y.position_boxplot) / 30)) | |
| ) | |
| } | |
| svg(paste("./svg/",colnames(dataa)[i], ".svg", sep = "")) | |
| plot(p) | |
| dev.off() | |
| incProgress(1 / ncol(dataa)) | |
| Sys.sleep(0.25) | |
| } | |
| }) | |
| data.frame(name = colnames(dataa)[-c(1:metainfocol)], path = paste("file:/", svg_path, "/", colnames(dataa)[-c(1:metainfocol)], ".svg", sep = "")) %>% write.csv("./svg/path.csv") | |
| output$testtext1 <- renderText({ | |
| "Finish" | |
| }) | |
| } | |
| create_barplot <- function(data, x_var, y_var, col, alpha, size, ylab_text, ggtitle_text) { | |
| p <- ggplot(data, aes_string(x = x_var, y = y_var, fill = x_var)) + | |
| geom_bar(color = "black", stat = "summary",fun = "mean",lwd = 1.2,width = 0.6) + | |
| ylab(ylab_text) + | |
| ggtitle(paste(ggtitle_text, "", sep = "")) + | |
| scale_fill_manual(values = unlist(col)) | |
| p | |
| } | |
| process_barplot <- function(input,yval,dataa,col) { | |
| y <- yval %>% as.character() | |
| p <- create_barplot(dataa, input$w, y, col, input$alpha, input$size, input$yAxisLabel, y) | |
| if (input$q != "" && input$pvaluecheck == TRUE) { | |
| tukey_result <- process_tukey_result(input,y,input$q,p,dataa,0.05,input$Fontsize) | |
| p <- p + add_pvalue(tukey_result,remove.bracket = TRUE, | |
| bracket.size = 0.000001, | |
| label = "{symbol}", | |
| tip.length = 0, | |
| label.size = tukey_result$size,inherit.aes = FALSE,y.position = tukey_result$y.position_barplot) | |
| } | |
| p <- p + theme( | |
| axis.text.x = element_text(angle = 90, hjust = 1), | |
| axis.title.x = element_blank(), | |
| aspect.ratio = 0.75, | |
| text = element_text(size = input$Fontsize) | |
| ) | |
| ggplotly(p) | |
| } | |
| process_barplot_diagram <- function(input,yval,dataa,col) { | |
| y <- yval %>% as.character() | |
| p <- create_barplot(dataa, input$w, y, col, input$alpha, input$size, input$yAxisLabel, y) | |
| p <- p + theme_prism( | |
| base_fontface = "plain", | |
| base_line_size = 0.9, | |
| base_family = "Arial") + | |
| scale_x_discrete( | |
| guide = guide_prism_bracket(width = 0.1), | |
| labels = scales::wrap_format(5)) + | |
| theme( | |
| legend.position = "none", | |
| axis.title.x = element_blank(), | |
| aspect.ratio = 1.0, | |
| text = element_text(size = input$Fontsize)) | |
| if (input$q != "" && input$pvaluecheck == TRUE) { | |
| tukey_result <- process_tukey_result(input,y,input$q,p,dataa,0.05,input$Fontsize) | |
| p <- p + add_pvalue(tukey_result,remove.bracket = TRUE, | |
| bracket.size = 0.000001, | |
| label = "{symbol}", | |
| tip.length = 0, | |
| label.size = tukey_result$size,inherit.aes = FALSE,y.position = tukey_result$y.position_barplot) | |
| } | |
| p | |
| } | |
| process_action_barplot <- function(input,dataa,metainfocol,svg_path,col,output) { | |
| withProgress(message = 'Calculation in progress', detail = 'This may take a while...', value = 1, { | |
| startnum <- 1 + metainfocol | |
| for (i in startnum:ncol(dataa)) { | |
| yval <- colnames(dataa)[i] | |
| p <- create_barplot(dataa, input$w, dataa[[yval]], col, input$alpha, input$size, input$yAxisLabel, "") | |
| p <- p + theme_prism( | |
| base_fontface = "plain", | |
| base_line_size = 0.9, | |
| base_family = "Arial") + | |
| scale_x_discrete( | |
| guide = guide_prism_bracket(width = 0.1), | |
| labels = scales::wrap_format(5)) + | |
| theme( | |
| legend.position = "none", | |
| axis.title.x = element_blank(), | |
| aspect.ratio = 1.0, | |
| text = element_text(size = input$Fontsize)) | |
| if (input$q!= "" && input$pvaluecheck == TRUE) { | |
| tukey_result <- process_tukey_result(input,yval,input$q,p,dataa,0.05,input$Fontsize) | |
| p <- p + add_pvalue(tukey_result,remove.bracket = TRUE, | |
| bracket.size = 0.000001, | |
| label = "{symbol}", | |
| tip.length = 0, | |
| label.size = tukey_result$size,inherit.aes = FALSE,y.position = tukey_result$y.position_barplot) | |
| } | |
| svg(paste("./svg/",colnames(dataa)[i], ".svg", sep = "")) | |
| plot(p) | |
| dev.off() | |
| } | |
| incProgress(1 / ncol(dataa)) | |
| Sys.sleep(0.25) | |
| }) | |
| data.frame(name = colnames(dataa)[-c(1:metainfocol)], path = paste("file:/", svg_path, "/", colnames(dataa)[-c(1:metainfocol)], ".svg", sep = "")) %>% write.csv("./svg/path.csv") | |
| output$testtext1 <- renderText({ | |
| "Finish" | |
| }) | |
| } | |
| process_violinplot <- function(input,yval,dataa,col) { | |
| y <- yval %>% as.character() | |
| p <- create_violinplot(dataa, input$w, y, col, input$alpha, input$size, input$yAxisLabel, y) | |
| if (input$q != "" &&input$pvaluecheck == TRUE) { | |
| tukey_result <- process_tukey_result(input,y,input$q,p,dataa,0.05,input$Fontsize) | |
| p <- p + add_pvalue(tukey_result, remove.bracket = TRUE, bracket.size = 0.000001, label = "{symbol}", tip.length = 0, | |
| label.size = tukey_result$size, inherit.aes = FALSE,y.position = tukey_result$y.position_boxplot) + scale_y_continuous( | |
| limits = c(min(dataa[[y]]), (max(tukey_result$y.position_boxplot) + max(tukey_result$y.position_boxplot) / 30)) | |
| ) | |
| } | |
| p <- p + theme( | |
| #legend.position = "none", | |
| axis.text.x = element_text(angle = 90, hjust = 1), | |
| axis.title.x = element_blank(), | |
| aspect.ratio = 0.75, | |
| text = element_text(size = input$Fontsize) | |
| ) | |
| ggplotly(p) | |
| # } | |
| } | |
| create_violinplot <- function(data, x_var, y_var, col, alpha, size, ylab_text, ggtitle_text) { | |
| p <- ggplot(data, aes_string(x = x_var, y = y_var, fill = x_var)) + | |
| geom_violin(adjust = 2,trim = FALSE) + | |
| ylab(ylab_text) + | |
| ggtitle(paste(ggtitle_text, "", sep = "")) + | |
| scale_fill_manual(values = unlist(col))+ | |
| stat_summary(fun = "mean",geom = "crossbar",color = "black",linewidth = 0.5, width = 0.5) | |
| p | |
| } | |
| process_violinplot_diagram <- function(input,yval,dataa,col) { | |
| y <- yval %>% as.character() | |
| p <- create_violinplot(dataa, input$w, y, col, input$alpha, input$size, input$yAxisLabel, y) | |
| p <- p + theme_prism( | |
| base_fontface = "plain", | |
| base_line_size = 0.9, | |
| base_family = "Arial") + | |
| scale_x_discrete( | |
| guide = guide_prism_bracket(width = 0.1), | |
| labels = scales::wrap_format(5)) + | |
| theme( | |
| legend.position = "none", | |
| axis.title.x = element_blank(), | |
| aspect.ratio = 1.0, | |
| text = element_text(size = input$Fontsize)) | |
| if (input$q != "" &&input$pvaluecheck == TRUE) { | |
| tukey_result <- process_tukey_result(input,y,input$q,p,dataa,0.05,input$Fontsize) | |
| p <- p + add_pvalue(tukey_result, remove.bracket = TRUE, bracket.size = 0.000001, label = "{symbol}", tip.length = 0, | |
| label.size = tukey_result$size, inherit.aes = FALSE,y.position = tukey_result$y.position_boxplot) + scale_y_continuous( | |
| limits = c(min(dataa[[y]]), (max(tukey_result$y.position_boxplot) + max(tukey_result$y.position_boxplot) / 30)) | |
| ) | |
| } | |
| p | |
| } | |
| process_action_violinplot <- function(input,dataa,metainfocol,svg_path,col,output) { | |
| withProgress(message = 'Calculation in progress', detail = 'This may take a while...', value = 1, { | |
| startnum <- 1 + metainfocol | |
| for (i in startnum:ncol(dataa)) { | |
| yval <- colnames(dataa)[i] | |
| p <- create_violinplot(dataa, input$w, dataa[[yval]], col, input$alpha, input$size, input$yAxisLabel, "") | |
| p <- p + theme_prism( | |
| base_fontface = "plain", | |
| base_line_size = 0.9, | |
| base_family = "Arial") + | |
| scale_x_discrete( | |
| guide = guide_prism_bracket(width = 0.1), | |
| labels = scales::wrap_format(5)) + | |
| theme( | |
| legend.position = "none", | |
| axis.title.x = element_blank(), | |
| aspect.ratio = 1.0, | |
| text = element_text(size = input$Fontsize)) | |
| if (input$q!= "" && input$pvaluecheck == TRUE) { | |
| tukey_result <- process_tukey_result(input,yval,input$q,p,dataa,0.05,input$Fontsize) | |
| p <- p + add_pvalue(tukey_result, remove.bracket = TRUE, bracket.size = 0.000001, label = "{symbol}", tip.length = 0, | |
| label.size = tukey_result$size, inherit.aes = FALSE,y.position = tukey_result$y.position_boxplot) + scale_y_continuous( | |
| limits = c(min(dataa[[yval]]), (max(tukey_result$y.position_boxplot) + max(tukey_result$y.position_boxplot) / 30)) | |
| ) | |
| } | |
| svg(paste("./svg/",colnames(dataa)[i], ".svg", sep = "")) | |
| plot(p) | |
| dev.off() | |
| } | |
| incProgress(1 / ncol(dataa)) | |
| Sys.sleep(0.25) | |
| }) | |
| data.frame(name = colnames(dataa)[-c(1:metainfocol)], path = paste("file:/", svg_path, "/", colnames(dataa)[-c(1:metainfocol)], ".svg", sep = "")) %>% write.csv("./svg/path.csv") | |
| output$testtext1 <- renderText({ | |
| "Finish" | |
| }) | |
| } | |
| process_polarplot <- function(input,yval,dataa,col) { | |
| # if(is.na(unique(select(dataa,input$w))) != TRUE){ | |
| y <- yval %>% as.character() | |
| p <- create_polarplot(dataa, input$w, y, col, input$alpha, input$size, input$yAxisLabel, y, input$Fontsize) | |
| if (input$q != "" && input$pvaluecheck == TRUE) { | |
| tukey_result <- process_tukey_result(input,y,input$q,p,dataa,0.05,input$Fontsize) | |
| p <- p + add_pvalue(tukey_result,remove.bracket = TRUE, | |
| bracket.size = 0.000001, | |
| label = "{symbol}", | |
| tip.length = 0, | |
| label.size = tukey_result$size,inherit.aes = FALSE,y.position = tukey_result$y.position_barplot) | |
| } | |
| plot(p) | |
| # } | |
| } | |
| create_polarplot <- function(data, x_var, y_var, col, alpha, size, ylab_text, ggtitle_text, Fontsize) { | |
| p <- ggplot(data, aes_string(x = x_var, y = y_var, fill = x_var)) + | |
| geom_bar(color = "black", stat = "summary",fun = "mean",lwd = 1.2,width = 0.6) + | |
| coord_polar()+ | |
| scale_fill_manual(values = unlist(col))+ | |
| labs( | |
| x="", | |
| y="")+ | |
| theme_minimal(10) + | |
| theme( | |
| axis.text.x = element_text(size = Fontsize, angle = 360,hjust=0.8), | |
| axis.title.x = element_blank(), | |
| panel.grid.minor = element_blank(), | |
| axis.ticks.y = element_blank())+ | |
| easy_remove_axes() | |
| return(p) | |
| } | |
| process_dotplot <- function(input,yval,dataa,col) { | |
| y <- yval %>% as.character() | |
| p <- create_dotplot(dataa, input$w, y, col, input$alpha, input$size, input$yAxisLabel, y) | |
| if (input$q != "" && input$pvaluecheck == TRUE) { | |
| tukey_result <- process_tukey_result(input,y,input$q,p,dataa,0.05,input$Fontsize) | |
| p <- p + add_pvalue(tukey_result, remove.bracket = TRUE, bracket.size = 0.000001, label = "{symbol}", tip.length = 0, | |
| label.size = tukey_result$size, inherit.aes = FALSE,y.position = tukey_result$y.position_boxplot) + scale_y_continuous( | |
| limits = c(min(tukey_result$y.min.position), (max(tukey_result$y.position_boxplot) + max(tukey_result$y.position_boxplot) / 30)) | |
| ) | |
| } | |
| p <- p + theme( | |
| axis.title.x = element_blank(), | |
| aspect.ratio = 0.2, | |
| axis.text.x = element_text(angle = 90, hjust = 1), | |
| text = element_text(size = input$Fontsize) | |
| ) | |
| ggplotly(p,tooltip = c("name","x")) | |
| } | |
| create_dotplot <- function(data, x_var, y_var, col, alpha, size, ylab_text, ggtitle_text) { | |
| p <- ggplot(data,aes_string(x = x_var, y = y_var, fill = x_var)) + | |
| ggbeeswarm::geom_beeswarm(aes(text = name), | |
| cex = 0.1, | |
| shape = 21, | |
| size = size)+stat_summary(fun = "mean",geom = "crossbar",color = "red",linewidth = 0.5, width = 0.5)+ | |
| ylab(ylab_text) + | |
| ggtitle(paste(ggtitle_text, "", sep = "")) + | |
| theme_classic() + | |
| theme(aspect.ratio = 1.0)+ | |
| scale_fill_manual(values = unlist(col)) | |
| p | |
| } | |
| process_dotplot_diagram <- function(input,yval,dataa,col) { | |
| y <- yval %>% as.character() | |
| p <- create_dotplot(dataa, input$w, y, col, input$alpha, input$size, input$yAxisLabel, y) | |
| p <- p + theme_prism( | |
| base_fontface = "plain", | |
| base_line_size = 0.9, | |
| base_family = "Arial" | |
| ) + | |
| scale_x_discrete( | |
| guide = guide_prism_bracket(width = 0.1), | |
| labels = scales::wrap_format(5) | |
| ) + | |
| theme( | |
| legend.position = "none", | |
| axis.title.x = element_blank(), | |
| aspect.ratio = 1.0, | |
| text = element_text(size = input$Fontsize) | |
| ) | |
| if (input$q != "" && input$pvaluecheck == TRUE) { | |
| tukey_result <- process_tukey_result(input,y,input$q,p,dataa,0.05,input$Fontsize) | |
| p <- p + add_pvalue(tukey_result, remove.bracket = TRUE, bracket.size = 0.000001, label = "{symbol}", tip.length = 0, | |
| label.size = tukey_result$size, inherit.aes = FALSE,y.position = tukey_result$y.position_boxplot) + scale_y_continuous( | |
| limits = c(min(dataa[[y]]), (max(tukey_result$y.position_boxplot) + max(tukey_result$y.position_boxplot) / 30)) | |
| ) | |
| } | |
| p | |
| } | |
| process_action_dotplot <- function(input,dataa,metainfocol,svg_path,col,output) { | |
| withProgress(message = 'Calculation in progress', detail = 'This may take a while...', value = 1, { | |
| startnum <- 1 + metainfocol | |
| for (i in startnum:ncol(dataa)) { | |
| yval <- colnames(dataa)[i] | |
| p <- create_dotplot(dataa, input$w, dataa[[yval]], col, input$alpha, input$size, input$yAxisLabel, "") | |
| p <- p + theme_prism( | |
| base_fontface = "plain", | |
| base_line_size = 0.9, | |
| base_family = "Arial" | |
| ) + | |
| scale_x_discrete( | |
| guide = guide_prism_bracket(width = 0.1), | |
| labels = scales::wrap_format(5) | |
| ) + | |
| theme( | |
| legend.position = "none", | |
| axis.title.x = element_blank(), | |
| aspect.ratio = 1.0, | |
| text = element_text(size = input$Fontsize) | |
| ) | |
| if (input$q != "" && input$pvaluecheck == TRUE) { | |
| tukey_result <- process_tukey_result(input,yval,input$q,p,dataa,0.05,input$Fontsize) | |
| p <- p + add_pvalue(tukey_result, remove.bracket = TRUE, bracket.size = 0.000001, label = "{symbol}", tip.length = 0, | |
| label.size = tukey_result$size, inherit.aes = FALSE,y.position = tukey_result$y.position_boxplot) + scale_y_continuous( | |
| limits = c(min(dataa[[yval]]), (max(tukey_result$y.position_boxplot) + max(tukey_result$y.position_boxplot) / 30)) | |
| ) | |
| } | |
| svg(paste("./svg/",colnames(dataa)[i], ".svg", sep = "")) | |
| plot(p) | |
| dev.off() | |
| incProgress(1 / ncol(dataa)) | |
| Sys.sleep(0.25) | |
| } | |
| }) | |
| data.frame(name = colnames(dataa)[-c(1:metainfocol)], path = paste("file:/", svg_path, "/", colnames(dataa)[-c(1:metainfocol)], ".svg", sep = "")) %>% write.csv("./svg/path.csv") | |
| output$testtext1 <- renderText({ | |
| "Finish" | |
| }) | |
| } | |
| process_select_color_input <- function(input,data) { | |
| if (length(grep(paste0(unique(as.matrix(select(data, input$w)))[1], "_selectcolor"), names(input), value = TRUE)) != 0) { | |
| inputlist <- grep("selectcolor", names(input), value = TRUE) | |
| for (input_name in inputlist) { | |
| collist[str_remove_all(input_name, pattern = "_selectcolor")] <- input[[input_name]] | |
| } | |
| cola <<- unlist(collist) | |
| cola <- cola[c(unique(data[[input$w]]))] | |
| return(cola) | |
| } | |
| } | |
| process_tukey_result <- function(input,yval, q,plot_obj, dataa, p_adj_threshold, Fontsize) { | |
| yval <- gsub("`","",yval) | |
| y <- dataa %>% pull(as.symbol(yval)) | |
| w <- dataa %>% pull(as.symbol(input$w)) | |
| tukey_result <- TukeyHSD(aov(y ~ w, data = dataa)) | |
| tukey_result <- data.frame(tukey_result$w) | |
| a <- str_split_fixed(rownames(tukey_result), "-", 2) | |
| colnames(a) <- c("Class1", "Class2") | |
| tukey_result <- cbind(a, tukey_result) | |
| maxvalue <- select(dataa,input$w,yval) %>% | |
| group_by_(input$w) %>% | |
| mutate(Mean = mean(!!as.symbol(yval))) %>% | |
| ungroup() %>% | |
| distinct(!!as.symbol(input$w),.keep_all = TRUE ) | |
| maxvalue <- max(maxvalue$Mean) | |
| tukey_result <- filter(tukey_result, Class1 %in% q | Class2 %in% q) %>% | |
| mutate(group2 = ifelse(Class1 == q, Class2, Class1)) %>% | |
| mutate(group1 = paste0(q)) %>% | |
| mutate(symbol = ifelse(p.adj < p_adj_threshold, "*", "")) %>% | |
| select(group1, group2, p.adj, symbol) %>% | |
| mutate(y.position_boxplot = max(dataa[[yval]])) %>% | |
| mutate(y.position_barplot = maxvalue-maxvalue/15 ) %>% | |
| mutate(y.min.position = min(dataa[[yval]])) %>% | |
| mutate(size = ifelse(symbol != "*", 0, Fontsize)) | |
| return(tukey_result) | |
| } |