Forked from Midoux Cedric / easy16S
150 commits behind the upstream repository.
server.R 22.66 KiB
library(shinydashboard)
shinyServer
(function(input, output, session)
  checkNull <- function(x) {
    if (!exists(as.character(substitute(x)))) {
      return(NULL)
    } else if (is.null(x)) {
      return(NULL)
    } else if (length(x) > 1) {
      return(x)
    else if (x %in% c(0, "", NA, "NULL")) {
      return(NULL)
    } else {
      return(x)
  beautifulTable <- function(data)  {
    DT::datatable(
      data = data,
      rownames = FALSE,
      filter = "top",
      extensions = c("Buttons", "ColReorder", "FixedColumns"),
      options = list(
        dom = "lBtip",
        pageLength = 10,
        lengthMenu = list(c(10, 25, 50, 100,-1), list('10', '25', '50', '100', 'All')),
        buttons = list(
          'colvis',
          list(
            extend = 'collection',
            buttons = c('copy', 'csv', 'excel', 'pdf'),
            text = 'Download'
        colReorder = TRUE,
        scrollX = TRUE,
        fixedColumns = list(leftColumns = 1, rightColumns = 0)
      width = "auto",
      height = "auto"
  source(
    "https://raw.githubusercontent.com/mahendra-mariadassou/phyloseq-extended/master/R/load-extra-functions.R"
  data16S <- reactive({
    if (input$biomFormat == "std")
      d <- import_biom(
        BIOMfilename = input$fileBiom$datapath,
        treefilename = input$fileTree$datapath,
        refseqfilename = input$fileSeq$datapath
    } else if (input$biomFormat == "frogs") {
      d <- import_frogs(
        biom = input$fileBiom$datapath,
        treefilename = input$fileTree$datapath,
        refseqfilename = input$fileSeq$datapath
    colnames(tax_table(d)) <-
      c("Kingdom",
        "Phylum",
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
"Class", "Order", "Family", "Genus", "Species", "Strain")[1:length(rank_names(d))] tax_table(d)[grep("unknown ", tax_table(d))] <- NA #tax_table(d)[grep("Unclassified", tax_table(d))] <- NA if (!is.null(input$fileMeta)) { if (input$CSVsep == "excel") { sample_data(d) <- RcmdrMisc::readXL(input$fileMeta$datapath, rownames = TRUE, header = TRUE) } else { sample_data(d) <- read.csv( input$fileMeta$datapath, header = TRUE, sep = input$CSVsep, row.names = 1, na.strings = NA ) } } else { n <- data.frame(sample_names(d) , row.names = sample_names(d)) names(n) <- "sample_names" sample_data(d) <- n } if (input$rareData) { d <- rarefy_even_depth( d, replace = FALSE, rngseed = as.integer(Sys.time()), verbose = FALSE ) } return(d) }) output$rarefactionMin <- renderText({ if (!is.null(input$fileBiom)) { paste("(min sample =", format(min(sample_sums(data16S( ))), big.mark = " "), "reads)") } else { paste("(min sample =", 0, "reads)") } }) output$rarefaction <- renderText({ if (input$rareData) { "<font color=\"#FF0000\"><b> Vous travaillez acctuellement avec des données raréfiés </b></font>" } }) output$phyloseqPrint <- renderPrint({ validate( need( !is.null(input$fileBiom), "Merci de commencer par importer un fichier d'abondance au format BIOM. Celui-ci peut etre obtenu a l'issue du workflow FROGS avec l'operation 'FROGS BIOM to std BIOM'" ) ) data16S() }) output$summaryTable <- renderUI({ if (is.null(input$fileBiom)) return() box( title = "Tables",
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
width = NULL, status = "primary", tabsetPanel( tabPanel("otu_table", beautifulTable( data.frame(OTU = taxa_names(data16S()), otu_table(data16S())) )), tabPanel("tax_table", beautifulTable( data.frame(OTU = taxa_names(data16S()), tax_table(data16S())) )), if (!is.null(input$fileMeta)) { tabPanel("sample_data", beautifulTable(data.frame( SAMPLE = sample_names(data16S()), sample_data(data16S()) ))) } ) ) }) output$histUI <- renderUI({ if (is.null(input$fileBiom)) return() box( title = "Paramètres", width = NULL, status = "primary", selectInput( "barFill", label = "Niveau taxo :", choices = rank_names(data16S()) ), if (!is.null(input$fileMeta)) { selectInput( "barGrid", label = "Regroupement :", choices = c("..." = 0, sample_variables(data16S())) ) }, if (!is.null(input$fileMeta)) { selectInput("barX", label = "X :", choices = c("..." = 0, sample_variables(data16S()))) } ) }) output$histo <- renderPlot({ validate(need( !is.null(input$fileBiom), "Merci d'importer un fichier d'abondance" )) p <- plot_bar( physeq = data16S(), fill = input$barFill, x = ifelse(is.null(checkNull(input$barX)), "Sample", input$barX) ) if (!is.null(checkNull(input$barGrid))) { p <- p + facet_grid(paste(".", "~", input$barGrid), scales = "free_x") } return(p) }) output$histFocusUIfocusRank <- renderUI({ if (is.null(input$fileBiom)) return()
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
radioButtons( "focusRank", label = "Niveau taxo :", choices = rank_names(data16S())[-length(rank_names(data16S()))], inline = TRUE ) }) output$histFocusUIfocusTaxa <- renderUI({ if (is.null(input$fileBiom)) return() selectInput( "focusTaxa", label = "Taxa :", choices = unique(as.vector(tax_table(data16S())[, input$focusRank])), selected = TRUE ) }) output$histFocusUIfocusNbTaxa <- renderUI({ if (is.null(input$fileBiom)) return() sliderInput( "focusNbTaxa", label = "Nombre de sous-taxons :", min = 0, #max = sum(tax_table(tax_glom(data16S(), rank_names(data16S())[1+as.integer(input$focusRank)]))[, as.integer(input$focusRank)]==input$focusTaxa) max = 30 , value = 10 ) }) output$histFocusUIfocusGrid <- renderUI({ if (is.null(input$fileBiom) && is.null(input$fileMeta)) return() selectInput( "focusGrid", label = "Regroupement :", choices = c("..." = 0, sample_variables(data16S())) ) }) output$histFocusUIfocusX <- renderUI({ if (is.null(input$fileBiom) && is.null(input$fileMeta)) return() selectInput("focusX", label = "X :", choices = c("..." = 0, sample_variables(data16S()))) }) output$histoFocus <- renderPlot({ validate(need( !is.null(input$fileBiom), "Merci d'importer un fichier d'abondance" )) p <- plot_composition( physeq = data16S(), taxaRank1 = input$focusRank, taxaSet1 = input$focusTaxa, taxaRank2 = rank_names(data16S())[which(rank_names(data16S())==input$focusRank) + 1], numberOfTaxa = input$focusNbTaxa, fill = rank_names(data16S())[which(rank_names(data16S())==input$focusRank) + 1], x = ifelse(is.null(checkNull(input$focusX)), "Sample", input$focusX) ) if (!is.null(checkNull(input$focusGrid))) { p <- p + facet_grid(paste(".", "~", input$focusGrid), scales = "free_x") } return(p)
281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
}) output$clustUI <- renderUI({ if (is.null(input$fileBiom)) return() box( title = "Paramètres", width = NULL, status = "primary", selectInput( "clustDist", label = "Distance :", choices = list( "bray", "jaccard", "unifrac", "wunifrac", "dpcoa", "jsd", "euclidean" ) ), selectInput( "clustMethod", label = "Methode :", choices = list( "ward.D2", "ward.D", "single", "complete", "average", "mcquitty", "median", "centroid" ) ), if (!is.null(input$fileMeta)) { selectInput( "clustCol", label = "Couleur :", choices = c("..." = 0, sample_variables(data16S())) ) } ) }) output$clust <- renderPlot({ validate(need( !is.null(input$fileBiom), "Merci d'importer un fichier d'abondance" )) plot_clust( physeq = data16S(), dist = input$clustDist, method = input$clustMethod, color = checkNull(input$clustCol) ) }) output$richnessAUI <- renderUI({ if (is.null(input$fileBiom)) { return() } box( title = "Paramètres", width = NULL, status = "primary", checkboxGroupInput( "richnessMeasures", label = "Mesures :",
351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
choices = c( "Observed", "Chao1", "ACE", "Shannon", "Simpson", "InvSimpson", "Fisher" ), selected = c( "Observed", "Chao1", "ACE", "Shannon", "Simpson", "InvSimpson", "Fisher" ), inline = TRUE ), if (!is.null(input$fileMeta)) { selectInput( "richnessX", label = "X :", choices = c("..." = 0, sample_variables(data16S())) ) }, if (!is.null(input$fileMeta)) { selectInput( "richnessColor", label = "Couleur :", choices = c("..." = 0, sample_variables(data16S())) ) }, if (!is.null(input$fileMeta)) { selectInput( "richnessShape", label = "Forme :", choices = c("..." = 0, sample_variables(data16S())) ) }, radioButtons( "richnessBoxplot", label = "Representation :", choices = list( "Points seuls" = 1, "Boxplot et points" = 2, "Boxplot seul" = 3 ), selected = 2, inline = TRUE ) ) }) output$richnessA <- renderPlot({ validate(need( !is.null(input$fileBiom), "Merci d'importer un fichier d'abondance" )) p <- plot_richness( physeq = data16S(), x = ifelse(is.null(checkNull( input$richnessX )), "samples", input$richnessX), color = checkNull(input$richnessColor), shape = checkNull(input$richnessShape), measures = checkNull(input$richnessMeasures) ) if (input$richnessBoxplot >= 2) {
421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
p <- p + geom_boxplot() } if (input$richnessBoxplot <= 2) { p <- p + geom_point() } return(p) }) output$richnessATable <- renderUI({ validate(need( !is.null(input$fileBiom), "Merci d'importer un fichier d'abondance" )) p(beautifulTable(data.frame( SAMPLE = sample_names(data16S()), round(estimate_richness(data16S()), digits = 2) ))) }) output$richnessBUI <- renderUI({ if (is.null(input$fileMeta)) { return() } box( title = "Paramètres", width = NULL, status = "primary", selectInput( "richnessOrder", label = "Ordre de tri des echantillons :", choices = c("..." = 0, sample_variables(data16S())) ) ) }) output$richnessB <- renderPlot({ validate(need( !is.null(input$fileBiom), "Merci d'importer un fichier d'abondance" )) beta <- melt(as(distance(data16S(), method = input$richnessBDist), "matrix")) colnames(beta) <- c("x", "y", "distance") if (!is.null(checkNull(input$richnessOrder))) { new_factor = as.factor(get_variable(data16S(), input$richnessOrder)) variable_sort <- as.factor(get_variable(data16S(), input$richnessOrder)[order(new_factor)]) L = levels(reorder(sample_names(data16S()), as.numeric(new_factor))) beta$x <- factor(beta$x, levels = L) beta$y <- factor(beta$y, levels = L) palette <- hue_pal()(length(levels(new_factor))) tipColor <- col_factor(palette, levels = levels(new_factor))(variable_sort) } p <- ggplot(beta, aes(x = x, y = y, fill = distance)) + geom_tile() p <- p + theme( axis.text.x = element_text( angle = 90, hjust = 1, color = checkNull(tipColor) ), axis.text.y = element_text(color = checkNull(tipColor)), axis.title.x = element_blank(), axis.title.y = element_blank() ) return(p + scale_fill_gradient2()) }) output$networkBUI <- renderUI({
491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560
if (is.null(input$fileBiom)) { return() } box( title = "Paramètres", width = NULL, status = "primary", sliderInput( "netwMax", label = "Cutoff :", min = 0, max = 1, value = 0.7 ), checkboxInput("netwOrphan", label = "Garder les points orphelins", value = TRUE), if (!is.null(input$fileMeta)) { selectInput( "netwCol", label = "Couleur :", choices = c("..." = 0, sample_variables(data16S())) ) }, if (!is.null(input$fileMeta)) { selectInput( "netwShape", label = "Forme :", choices = c("..." = 0, sample_variables(data16S())) ) }, if (!is.null(input$fileMeta)) { selectInput( "netwLabel", label = "Label :", choices = c( select = "", "Sample name" = "value", sample_variables(data16S()) ) ) } ) }) output$networkB <- renderPlot({ validate(need( !is.null(input$fileBiom), "Merci d'importer un fichier d'abondance" )) g <- make_network( data16S(), distance = input$richnessBDist, max.dist = input$netwMax, keep.isolates = input$netwOrphan ) p <- plot_network( g, physeq = data16S(), color = checkNull(input$netwCol), shape = checkNull(input$netwShape), label = checkNull(input$netwLabel), hjust = 2, title = NULL ) return(p) }) output$richnessBTable <- renderUI({ validate(need(
561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630
!is.null(input$fileBiom), "Merci d'importer un fichier d'abondance" )) p(beautifulTable(data.frame( SAMPLE = sample_names(data16S()), round(as.matrix( distance(data16S(), method = input$richnessBDist) ), digits = 2) ))) }) output$rarefactionCurve <- renderPlot({ validate(need( !is.null(input$fileBiom), "Merci d'importer un fichier d'abondance" )) p <- ggrare( physeq = data16S(), step = input$rarefactionStep, color = checkNull(input$rarefactionColor), se = FALSE ) if (!is.null(checkNull(input$rarefactionGrid))) { p <- p + facet_grid(paste(".", "~", input$rarefactionGrid)) } if (!input$rareData) { if (input$rarefactionMin) { p <- p + geom_vline(xintercept = min(sample_sums(data16S())), color = "gray60") } } return(p) }) output$rarefactionCurveUI <- renderUI({ if (is.null(input$fileBiom)) return() box( title = "Paramètres", width = NULL, status = "primary", sliderInput( "rarefactionStep", label = "Etapes de calcul :", min = 1, max = 1000, value = 100 ), if (!input$rareData) { checkboxInput("rarefactionMin", label = "Afficher le seuil de l'echantillon minimal", value = TRUE) }, if (!is.null(input$fileMeta)) { selectInput( "rarefactionColor", label = "Couleur :", choices = c("..." = 0, sample_variables(data16S())) ) }, if (!is.null(input$fileMeta)) { selectInput( "rarefactionGrid", label = "Regroupement :", choices = c("..." = 0, sample_variables(data16S())) )
631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700
} ) }) output$HeatmapUI <- renderUI({ if (is.null(input$fileBiom)) return() box( title = "Paramètres", width = NULL, status = "primary", if (!is.null(input$fileMeta)) { selectInput( "heatmapGrid", label = "Regroupement :", choices = c("..." = 0, sample_variables(data16S())) ) }, if (!is.null(input$fileMeta)) { selectInput( "heatmapX", label = "X :", choices = c("..." = 0, sample_variables(data16S())) ) }, sliderInput( "heatmapTopOtu", label = "Selection des n OTU les plus abondant :", min = 1, max = ntaxa(data16S()), value = 250 ), selectInput( "heatmapDist", label = "Distance :", selected = "bray", choices = list( "bray", "jaccard", "unifrac", "wunifrac", "dpcoa", "jsd", "euclidean" ) ), selectInput( "heatmapMethod", label = "Methode :", selected = "NMDS", choices = list( "NMDS", "ward.D2", "ward.D", "single", "complete", "average", "mcquitty", "median", "centroid" ) ) ) }) output$Heatmap <- renderPlot({ validate(need( !is.null(input$fileBiom),
701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770
"Merci d'importer un fichier d'abondance" )) p <- plot_heatmap( physeq = prune_taxa(names(sort( taxa_sums(data16S()), decreasing = TRUE )[1:input$heatmapTopOtu]), data16S()), distance = input$heatmapDist, method = input$heatmapMethod, sample.order = checkNull(input$heatmapX), low = "yellow", high = "red", na.value = "white" ) if (!is.null(checkNull(input$heatmapGrid))) { p <- p + facet_grid(paste(".", "~", input$heatmapGrid), scales = "free_x") } return(p) }) output$treeUI <- renderUI({ if (is.null(input$fileBiom) | is.null(input$fileTree)) return() box( title = "Paramètres", width = NULL, status = "primary", radioButtons( "treeRank", label = "Niveau taxonomique légendé :", choices = c( aucun = "", rank_names(data16S()), OTU = "taxa_names" ), inline = TRUE ), sliderInput( "treeTopOtu", label = "Selection des n OTU les plus abondant :", min = 1, max = ntaxa(data16S()), value = 20 ), checkboxInput("treeRadial", label = "Arbre radial", value = FALSE), checkboxInput("treeSample", label = "Show samples", value = TRUE), if (!is.null(input$fileMeta)) { selectInput( "treeCol", label = "Couleur :", choices = c("..." = 0, sample_variables(data16S())) ) }, if (!is.null(input$fileMeta)) { selectInput( "treeShape", label = "Forme :", choices = c("..." = 0, sample_variables(data16S())) ) } ) }) output$tree <- renderPlot({ validate(need( !is.null(input$fileBiom), "Merci d'importer un fichier d'abondance" )) validate(need(!is.null(input$fileTree), "Merci d'importer un arbre"))
771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840
p <- plot_tree( physeq = prune_taxa(names(sort( taxa_sums(data16S()), decreasing = TRUE )[1:input$treeTopOtu]), data16S()), method = ifelse(input$treeSample, "sampledodge", "treeonly"), color = checkNull(input$treeCol), shape = checkNull(input$treeShape), size = "abundance", label.tips = checkNull(input$treeRank), sizebase = 5, ladderize = "left", plot.margin = 0 ) if (checkNull(input$treeRadial)) { return(p + coord_polar(theta = "y")) } else { return(p) } }) output$acpUI <- renderUI({ if (is.null(input$fileBiom)) return() box( title = "Paramètres", width = NULL, status = "primary", selectInput( "acpDist", label = "Distance :", selected = "bray", choices = list( "bray", "jaccard", "unifrac", "wunifrac", "dpcoa", "jsd", "euclidean" ) ), selectInput( "acpMethod", label = "Methode :", selected = "MDS", choices = list("DCA", "CCA", "RDA", "CAP", "DPCoA", "NMDS", "MDS", "PCoA") ), if (!is.null(input$fileMeta)) { selectInput( "acpCol", label = "Couleur :", choices = c("..." = 0, sample_variables(data16S())) ) }, if (!is.null(input$fileMeta)) { selectInput( "acpShape", label = "Forme :", choices = c("..." = 0, sample_variables(data16S())) ) }, if (!is.null(input$fileMeta)) { selectInput( "acpEllipse", label = "Ellipses :", choices = c("..." = 0, sample_variables(data16S())) )
841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875
}, if (!is.null(input$fileMeta)) { selectInput( "acpRep", label = "Barycentre :", choices = c("..." = 0, sample_variables(data16S())) ) } ) }) output$acp <- renderPlot({ validate(need( !is.null(input$fileBiom), "Merci d'importer un fichier d'abondance" )) p <- plot_samples( data16S(), ordination = ordinate( data16S(), method = input$acpMethod, distance = input$acpDist ), axes = c(1, 2), color = checkNull(input$acpCol), replicate = checkNull(input$acpRep), shape = checkNull(input$acpShape) ) if (!is.null(checkNull(input$acpEllipse))) { p <- p + stat_ellipse(aes_string(group = input$acpEllipse)) } return(p + theme_bw()) }) })