1*2abb3134SXin Lilibrary(shiny) 2*2abb3134SXin Li 3*2abb3134SXin Lisource("../../analysis/R/read_input.R") 4*2abb3134SXin Lisource("../../analysis/R/decode.R") 5*2abb3134SXin Li 6*2abb3134SXin Li# Random number associated with the session used in exported file names. 7*2abb3134SXin Liseed <- sample(10^6, 1) 8*2abb3134SXin Li 9*2abb3134SXin LiPlotCohorts <- function(x, highlighted, color = "grey") { 10*2abb3134SXin Li n <- nrow(x) 11*2abb3134SXin Li k <- ncol(x) 12*2abb3134SXin Li if (n < 16) { 13*2abb3134SXin Li par(mfrow = c(n, 1), mai = c(0, .5, .5, 0)) 14*2abb3134SXin Li } else if (n < 64) { 15*2abb3134SXin Li par(mfrow = c(n / 2, 2), mai = c(0, .5, .5, 0)) 16*2abb3134SXin Li } else { 17*2abb3134SXin Li par(mfrow = c(n / 4, 4), mai = c(0, .5, .5, 0)) 18*2abb3134SXin Li } 19*2abb3134SXin Li for (i in 1:n) { 20*2abb3134SXin Li cc <- rep(color, k) 21*2abb3134SXin Li if (!is.null(highlighted)) { 22*2abb3134SXin Li ind <- highlighted[which(ceiling(highlighted / k) == i)] %% k 23*2abb3134SXin Li cc[ind] <- "greenyellow" 24*2abb3134SXin Li } 25*2abb3134SXin Li barplot(x[i, ], main = paste0("Cohort ", i), col = cc, border = cc, 26*2abb3134SXin Li names.arg = "") 27*2abb3134SXin Li } 28*2abb3134SXin Li} 29*2abb3134SXin Li 30*2abb3134SXin LishinyServer(function(input, output, session) { 31*2abb3134SXin Li Params <- reactive({ 32*2abb3134SXin Li param_file <- input$params 33*2abb3134SXin Li if (!is.null(param_file)) { 34*2abb3134SXin Li params <- ReadParameterFile(param_file$datapath) 35*2abb3134SXin Li updateSelectInput(session, "size", selected = params$k) 36*2abb3134SXin Li updateSelectInput(session, "hashes", selected = params$h) 37*2abb3134SXin Li updateSelectInput(session, "instances", selected = params$m) 38*2abb3134SXin Li updateSliderInput(session, "p", value = params$p) 39*2abb3134SXin Li updateSliderInput(session, "q", value = params$q) 40*2abb3134SXin Li updateSliderInput(session, "f", value = params$f) 41*2abb3134SXin Li } else { 42*2abb3134SXin Li params <- list(k = as.numeric(input$size), 43*2abb3134SXin Li h = as.numeric(input$hashes), 44*2abb3134SXin Li m = as.numeric(input$instances), 45*2abb3134SXin Li p = as.numeric(input$p), 46*2abb3134SXin Li q = as.numeric(input$q), 47*2abb3134SXin Li f = as.numeric(input$f)) 48*2abb3134SXin Li } 49*2abb3134SXin Li params 50*2abb3134SXin Li }) 51*2abb3134SXin Li 52*2abb3134SXin Li Counts <- reactive({ 53*2abb3134SXin Li params <- Params() 54*2abb3134SXin Li counts_file <- input$counts 55*2abb3134SXin Li if (is.null(counts_file)) { 56*2abb3134SXin Li return(NULL) 57*2abb3134SXin Li } 58*2abb3134SXin Li 59*2abb3134SXin Li counts <- ReadCountsFile(counts_file$datapath, params) 60*2abb3134SXin Li updateNumericInput(session, "N", value = sum(counts[, 1])) 61*2abb3134SXin Li counts 62*2abb3134SXin Li }) 63*2abb3134SXin Li 64*2abb3134SXin Li output$countsUploaded <- reactive({ 65*2abb3134SXin Li ifelse(is.null(input$counts), FALSE, TRUE) 66*2abb3134SXin Li }) 67*2abb3134SXin Li outputOptions(output, 'countsUploaded', suspendWhenHidden=FALSE) 68*2abb3134SXin Li 69*2abb3134SXin Li Map <- reactive({ 70*2abb3134SXin Li params <- Params() 71*2abb3134SXin Li map_file <- input$map 72*2abb3134SXin Li if (is.null(map_file)) { 73*2abb3134SXin Li return(NULL) 74*2abb3134SXin Li } 75*2abb3134SXin Li 76*2abb3134SXin Li map <- ReadMapFile(map_file$datapath, params) 77*2abb3134SXin Li updateSelectInput(session, "selected_string", choices = map$strs, selected = map$strs[1]) 78*2abb3134SXin Li map 79*2abb3134SXin Li }) 80*2abb3134SXin Li 81*2abb3134SXin Li output$mapUploaded <- reactive({ 82*2abb3134SXin Li ifelse(is.null(input$map), FALSE, TRUE) 83*2abb3134SXin Li }) 84*2abb3134SXin Li outputOptions(output, 'mapUploaded', suspendWhenHidden=FALSE) 85*2abb3134SXin Li 86*2abb3134SXin Li DecodingParams <- reactive({ 87*2abb3134SXin Li list(alpha = as.numeric(input$alpha), 88*2abb3134SXin Li correction = input$correction) 89*2abb3134SXin Li }) 90*2abb3134SXin Li 91*2abb3134SXin Li Analyze <- reactive({ 92*2abb3134SXin Li if (is.null(input$map) || is.null(input$counts)) { 93*2abb3134SXin Li return() 94*2abb3134SXin Li } 95*2abb3134SXin Li params <- Params() 96*2abb3134SXin Li map <- Map() 97*2abb3134SXin Li counts <- Counts() 98*2abb3134SXin Li decoding_params <- DecodingParams() 99*2abb3134SXin Li 100*2abb3134SXin Li fit <- Decode(counts, map$map, params, 101*2abb3134SXin Li alpha = decoding_params$alpha, 102*2abb3134SXin Li correction = decoding_params$correction) 103*2abb3134SXin Li fit 104*2abb3134SXin Li }) 105*2abb3134SXin Li 106*2abb3134SXin Li # Results summary. 107*2abb3134SXin Li output$pr <- renderTable({ 108*2abb3134SXin Li Analyze()$summary 109*2abb3134SXin Li }, 110*2abb3134SXin Li include.rownames = FALSE, include.colnames = FALSE) 111*2abb3134SXin Li 112*2abb3134SXin Li # Results table. 113*2abb3134SXin Li output$tab <- renderDataTable({ 114*2abb3134SXin Li Analyze()$fit 115*2abb3134SXin Li }, 116*2abb3134SXin Li options = list(iDisplayLength = 100)) 117*2abb3134SXin Li 118*2abb3134SXin Li # Results barplot. 119*2abb3134SXin Li output$res_barplot <- renderPlot({ 120*2abb3134SXin Li fit <- Analyze()$fit 121*2abb3134SXin Li 122*2abb3134SXin Li par(mai = c(2, 1, 1, .5)) 123*2abb3134SXin Li 124*2abb3134SXin Li bp <- barplot(fit$proportion, col = "palegreen", 125*2abb3134SXin Li main = "Discovered String Distribution") 126*2abb3134SXin Li abline(h = Analyze()$privacy[7, 2], col = "darkred", lty = 2, lwd = 2) 127*2abb3134SXin Li text(bp[, 1], 0, paste(fit$strings, " "), srt = 45, adj = c(1, 1), xpd = NA) 128*2abb3134SXin Li legend("topright", legend = "Detection Frequency", lty = 2, lwd = 2, col = "darkred", 129*2abb3134SXin Li bty = "n") 130*2abb3134SXin Li }) 131*2abb3134SXin Li 132*2abb3134SXin Li # Epsilon. 133*2abb3134SXin Li output$epsilon <- renderTable({ 134*2abb3134SXin Li Analyze()$privacy 135*2abb3134SXin Li }, 136*2abb3134SXin Li include.rownames = FALSE, include.colnames = FALSE, digits = 4) 137*2abb3134SXin Li 138*2abb3134SXin Li output$map <- renderPlot({ 139*2abb3134SXin Li image(as.matrix(Map()$map), col = c("white", "darkred"), xaxt = "n", yaxt = "n", bty = "n") 140*2abb3134SXin Li }) 141*2abb3134SXin Li 142*2abb3134SXin Li # Estimated bits patterns. 143*2abb3134SXin Li output$ests <- renderPlot({ 144*2abb3134SXin Li ests <- Analyze()$ests 145*2abb3134SXin Li ind <- which(input$selected_string == Map()$strs) 146*2abb3134SXin Li high <- unlist(Map()$map_pos[ind, -1]) 147*2abb3134SXin Li PlotCohorts(ests, high, color = "darkred") 148*2abb3134SXin Li }) 149*2abb3134SXin Li 150*2abb3134SXin Li # Collisions. 151*2abb3134SXin Li output$collisions <- renderPlot({ 152*2abb3134SXin Li params <- Params() 153*2abb3134SXin Li map <- Map() 154*2abb3134SXin Li tab <- table(unlist(map$map_pos[, -1])) 155*2abb3134SXin Li tab <- tab[as.character(1:(params$k * params$m))] 156*2abb3134SXin Li tab[is.na(tab)] <- 0 157*2abb3134SXin Li tab <- matrix(tab, nrow = params$m, byrow = TRUE) 158*2abb3134SXin Li 159*2abb3134SXin Li ind <- which(input$selected_string == map$strs) 160*2abb3134SXin Li high <- unlist(map$map_pos[ind, -1]) 161*2abb3134SXin Li 162*2abb3134SXin Li PlotCohorts(tab, high, color = "navajowhite") 163*2abb3134SXin Li }) 164*2abb3134SXin Li 165*2abb3134SXin Li # Observed counts. 166*2abb3134SXin Li output$counts <- renderPlot({ 167*2abb3134SXin Li counts <- as.matrix(Analyze()$counts) 168*2abb3134SXin Li ind <- which(input$selected_string == Map()$strs) 169*2abb3134SXin Li high <- unlist(Map()$map_pos[ind, -1]) 170*2abb3134SXin Li PlotCohorts(counts, high, color = "darkblue") 171*2abb3134SXin Li }) 172*2abb3134SXin Li 173*2abb3134SXin Li # Downloadable datasets. 174*2abb3134SXin Li output$download_fit <- downloadHandler( 175*2abb3134SXin Li filename = function() { paste("results_", seed, "_", date(), '.csv', sep='') }, 176*2abb3134SXin Li content = function(file) { 177*2abb3134SXin Li write.csv(Analyze()$fit, file, row.names = FALSE) 178*2abb3134SXin Li } 179*2abb3134SXin Li ) 180*2abb3134SXin Li 181*2abb3134SXin Li output$download_summary <- downloadHandler( 182*2abb3134SXin Li filename = function() { paste("summary_", seed, "_", date(), '.csv', sep='') }, 183*2abb3134SXin Li content = function(file) { 184*2abb3134SXin Li write.csv(rbind(Analyze()$summary, Analyze()$privacy, Analyze()$params), 185*2abb3134SXin Li file, row.names = FALSE) 186*2abb3134SXin Li } 187*2abb3134SXin Li ) 188*2abb3134SXin Li 189*2abb3134SXin Li output$example_params <- renderTable({ 190*2abb3134SXin Li as.data.frame(ReadParameterFile("params.csv")) 191*2abb3134SXin Li }, 192*2abb3134SXin Li include.rownames = FALSE) 193*2abb3134SXin Li 194*2abb3134SXin Li output$example_counts <- renderTable({ 195*2abb3134SXin Li counts <- ReadCountsFile("counts.csv")[, 1:15] 196*2abb3134SXin Li cbind(counts, rep("...", nrow(counts))) 197*2abb3134SXin Li }, 198*2abb3134SXin Li include.rownames = FALSE, include.colnames = FALSE) 199*2abb3134SXin Li 200*2abb3134SXin Li output$example_map <- renderTable({ 201*2abb3134SXin Li map <- ReadMapFile("map.csv", ReadParameterFile("params.csv")) 202*2abb3134SXin Li map$map_pos[1:10, ] 203*2abb3134SXin Li }, 204*2abb3134SXin Li include.rownames = FALSE, include.colnames = FALSE) 205*2abb3134SXin Li 206*2abb3134SXin Li}) 207