1*2abb3134SXin Lilibrary(shiny) 2*2abb3134SXin Lisource("../../analysis/R/decode.R") 3*2abb3134SXin Lisource("../../analysis/R/simulation.R") 4*2abb3134SXin Lisource("../../analysis/R/encode.R") 5*2abb3134SXin Li 6*2abb3134SXin LiPlot <- function(x, color = "grey") { 7*2abb3134SXin Li n <- nrow(x) 8*2abb3134SXin Li if (n < 16) { 9*2abb3134SXin Li par(mfrow = c(n, 1), mai = c(0, .5, .5, 0)) 10*2abb3134SXin Li } else if (n < 64) { 11*2abb3134SXin Li par(mfrow = c(n / 2, 2), mai = c(0, .5, .5, 0)) 12*2abb3134SXin Li } else { 13*2abb3134SXin Li par(mfrow = c(n / 4, 4), mai = c(0, .5, .5, 0)) 14*2abb3134SXin Li } 15*2abb3134SXin Li for (i in 1:nrow(x)) { 16*2abb3134SXin Li barplot(x[i, ], main = paste0("Cohort ", i), col = color, border = color) 17*2abb3134SXin Li } 18*2abb3134SXin Li} 19*2abb3134SXin Li 20*2abb3134SXin LishinyServer(function(input, output) { 21*2abb3134SXin Li # Example state global variable. 22*2abb3134SXin Li es <- list() 23*2abb3134SXin Li 24*2abb3134SXin Li # Example buttons states. 25*2abb3134SXin Li ebs <- rep(0, 3) 26*2abb3134SXin Li 27*2abb3134SXin Li Params <- reactive({ 28*2abb3134SXin Li list(k = as.numeric(input$size), 29*2abb3134SXin Li h = as.numeric(input$hashes), 30*2abb3134SXin Li m = as.numeric(input$instances), 31*2abb3134SXin Li p = as.numeric(input$p), 32*2abb3134SXin Li q = as.numeric(input$q), 33*2abb3134SXin Li f = as.numeric(input$f)) 34*2abb3134SXin Li }) 35*2abb3134SXin Li 36*2abb3134SXin Li PopParams <- reactive({ 37*2abb3134SXin Li list(as.numeric(input$nstrs), 38*2abb3134SXin Li as.numeric(input$nonzero), 39*2abb3134SXin Li input$decay, 40*2abb3134SXin Li as.numeric(input$expo), 41*2abb3134SXin Li as.numeric(input$background) 42*2abb3134SXin Li ) 43*2abb3134SXin Li }) 44*2abb3134SXin Li 45*2abb3134SXin Li DecodingParams <- reactive({ 46*2abb3134SXin Li list(as.numeric(input$alpha), 47*2abb3134SXin Li input$correction) 48*2abb3134SXin Li }) 49*2abb3134SXin Li 50*2abb3134SXin Li Sample <- reactive({ 51*2abb3134SXin Li input$sample 52*2abb3134SXin Li N <- input$N 53*2abb3134SXin Li params <- Params() 54*2abb3134SXin Li pop_params <- PopParams() 55*2abb3134SXin Li decoding_params <- DecodingParams() 56*2abb3134SXin Li prop_missing <- input$missing 57*2abb3134SXin Li fit <- GenerateSamples(N, params, pop_params, 58*2abb3134SXin Li alpha = decoding_params[[1]], 59*2abb3134SXin Li correction = decoding_params[[2]], 60*2abb3134SXin Li prop_missing = prop_missing) 61*2abb3134SXin Li fit 62*2abb3134SXin Li }) 63*2abb3134SXin Li 64*2abb3134SXin Li # Results summary. 65*2abb3134SXin Li output$pr <- renderTable({ 66*2abb3134SXin Li Sample()$summary 67*2abb3134SXin Li }, 68*2abb3134SXin Li include.rownames = FALSE, include.colnames = FALSE) 69*2abb3134SXin Li 70*2abb3134SXin Li # Results table. 71*2abb3134SXin Li output$tab <- renderDataTable({ 72*2abb3134SXin Li Sample()$fit 73*2abb3134SXin Li }, 74*2abb3134SXin Li options = list(iDisplayLength = 100)) 75*2abb3134SXin Li 76*2abb3134SXin Li # Epsilon. 77*2abb3134SXin Li output$epsilon <- renderTable({ 78*2abb3134SXin Li Sample()$privacy 79*2abb3134SXin Li }, 80*2abb3134SXin Li include.rownames = FALSE, include.colnames = FALSE, digits = 4) 81*2abb3134SXin Li 82*2abb3134SXin Li # True distribution. 83*2abb3134SXin Li output$probs <- renderPlot({ 84*2abb3134SXin Li samp <- Sample() 85*2abb3134SXin Li probs <- samp$probs 86*2abb3134SXin Li detected <- match(samp$fit[, 1], samp$strs) 87*2abb3134SXin Li detection_frequency <- samp$privacy[7, 2] 88*2abb3134SXin Li PlotPopulation(probs, detected, detection_frequency) 89*2abb3134SXin Li }) 90*2abb3134SXin Li 91*2abb3134SXin Li # True bits patterns. 92*2abb3134SXin Li output$truth <- renderPlot({ 93*2abb3134SXin Li truth <- Sample()$truth 94*2abb3134SXin Li Plot(truth[, -1, drop = FALSE], color = "darkblue") 95*2abb3134SXin Li }) 96*2abb3134SXin Li 97*2abb3134SXin Li # Lasso plot. 98*2abb3134SXin Li output$lasso <- renderPlot({ 99*2abb3134SXin Li fit <- Sample()$lasso 100*2abb3134SXin Li if (!is.null(fit)) { 101*2abb3134SXin Li plot(fit) 102*2abb3134SXin Li } 103*2abb3134SXin Li }) 104*2abb3134SXin Li 105*2abb3134SXin Li output$resid <- renderPlot({ 106*2abb3134SXin Li resid <- Sample()$residual 107*2abb3134SXin Li params <- Params() 108*2abb3134SXin Li plot(resid, xlab = "Bloom filter bits", ylab = "Residuals") 109*2abb3134SXin Li abline(h = c(-1.96, 1.96), lty = 2, col = 2) 110*2abb3134SXin Li sq <- qnorm(.025 / length(resid)) 111*2abb3134SXin Li abline(h = c(sq, -sq), lty = 2, col = 3, lwd = 2) 112*2abb3134SXin Li abline(h = c(-3, 3), lty = 2, col = 4, lwd = 2) 113*2abb3134SXin Li abline(v = params$k * (0:params$m), lty = 2, col = "blue") 114*2abb3134SXin Li legend("topright", legend = paste0("SD = ", round(sd(resid), 2)), bty = "n") 115*2abb3134SXin Li }) 116*2abb3134SXin Li 117*2abb3134SXin Li # Estimated bits patterns. 118*2abb3134SXin Li output$ests <- renderPlot({ 119*2abb3134SXin Li ests <- Sample()$ests 120*2abb3134SXin Li Plot(ests, color = "darkred") 121*2abb3134SXin Li }) 122*2abb3134SXin Li 123*2abb3134SXin Li # Estimated vs truth. 124*2abb3134SXin Li output$ests_truth <- renderPlot({ 125*2abb3134SXin Li plot(unlist(Sample()$ests), unlist(Sample()$truth[, -1]), 126*2abb3134SXin Li xlab = "Estimates", ylab = "Truth", pch = 19) 127*2abb3134SXin Li abline(0, 1, lwd = 4, col = "darkred") 128*2abb3134SXin Li }) 129*2abb3134SXin Li 130*2abb3134SXin Li output$example <- renderPlot({ 131*2abb3134SXin Li params <- Params() 132*2abb3134SXin Li strs <- Sample()$strs 133*2abb3134SXin Li map <- Sample()$map 134*2abb3134SXin Li samp <- Sample() 135*2abb3134SXin Li 136*2abb3134SXin Li # First run on app start. 137*2abb3134SXin Li value <- sample(strs, 1) 138*2abb3134SXin Li res <- Encode(value, map, strs, params, N = input$N) 139*2abb3134SXin Li 140*2abb3134SXin Li if (input$new_user > ebs[1]) { 141*2abb3134SXin Li res <- Encode(es$value, map, strs, params, N = input$N) 142*2abb3134SXin Li ebs[1] <<- input$new_user 143*2abb3134SXin Li } else if (input$new_value > ebs[2]) { 144*2abb3134SXin Li res <- Encode(value, map, strs, params, cohort = es$cohort, id = es$id, 145*2abb3134SXin Li N = input$N) 146*2abb3134SXin Li ebs[2] <<- input$new_value 147*2abb3134SXin Li } else if (input$new_report > ebs[3]) { 148*2abb3134SXin Li res <- Encode(es$value, map, strs, params, B = es$B, 149*2abb3134SXin Li BP = es$BP, cohort = es$cohort, id = es$id, N = input$N) 150*2abb3134SXin Li ebs[3] <<- input$new_report 151*2abb3134SXin Li } 152*2abb3134SXin Li es <<- res 153*2abb3134SXin Li ExamplePlot(res, params$k, c(ebs, input$new_user, input$new_value, input$new_report)) 154*2abb3134SXin Li }) 155*2abb3134SXin Li 156*2abb3134SXin Li}) 157