From b2e7a363cbeea540d5df45fb8aabf82f26ea9e44 Mon Sep 17 00:00:00 2001 From: spegg Date: Wed, 3 Apr 2019 11:44:56 +0100 Subject: [PATCH] Inclusion of visNetwork as bbn drawing package --- app.R | 410 +++++++++++++++++++++++---------- data/Sub_littoral_sand.xlsx | Bin 22902 -> 0 bytes data/Sub_littoral_sand_BA.xlsx | Bin 23869 -> 0 bytes 3 files changed, 285 insertions(+), 125 deletions(-) delete mode 100644 data/Sub_littoral_sand.xlsx delete mode 100644 data/Sub_littoral_sand_BA.xlsx diff --git a/app.R b/app.R index 95a9a5c..64830db 100644 --- a/app.R +++ b/app.R @@ -14,57 +14,113 @@ modules::import(knitr) modules::import(shinycssloaders) modules::import(googleway) modules::import(bnlearn) +modules::import(visNetwork) parser <- modules::use('Parses.R') layers <- c("Pressures to Bio-Assemblages", "Bio-Assemblages to Output Processes", "Output Processes to Ecosystem services") transitions <- c("Pressures to Bio-Assemblages", "Pressures to Output Processes", "Pressures to Ecosystem services") +impacts <- c('Very High', '>=High', '>=Medium', '>=Low', 'All') +thresholds <- c(0.97, 0.9, 0.7, 0.17, 0) +impLabels <- c('Very High', 'High', 'Medium', 'Low', 'Very Low') + addResourcePath("js", "./www/js") - - - ui<-dashboardPage( - dashboardHeader(title = "JNCC MESO online"), - - #tags$style(.times-circle {color:800000 }), - #tags$style(.check-square {color:008000 }), - + dashboardHeader(title = "JNCC MESO online", + + tags$li( + id = "dropdownHelp", + class = "dropdown", + tags$head( + tags$script( + paste0( + "$(document).ready(function(){", + " $('#dropdownHelp')", + " .find('ul')", + " .click(function(e) { e.stopPropagation(); });", + "});" + ) + ) + ), + tags$a( + href = "javascript:void(0);", + class = "dropdown-toggle", + `data-toggle` = "dropdown", + icon("question") + ), + tags$ul( + class = "dropdown-menu", + style = "left: auto; right: 0; min-width: 200px", + tags$li( + tags$div( + style = "margin-left: auto; margin-right: auto; width: 90%;", + tags$a( + href = "Manual.pdf", + target = "_BLANK", + "Open user guide in a new tab" + ) + ) + ), + tags$li( + tags$div( + style = "margin-left: auto; margin-right: auto; width: 90%;", + downloadLink( + "linkBackgroundData", + "Download excel sheets" + ) + ) + ) + ) + ) + ), dashboardSidebar( sidebarMenu(id = "tabs", menuItem("Pressure Test", tabName = "1", icon = icon("arrow-down")), menuItem("Bayesian Network", tabName = "2", icon = icon("atom")), - menuItem("Habitats", tabName = "3", icon = icon("atlas")), - menuItem("Ingestion", tabName = "4", icon = icon("utensils")), + #menuItem("Habitats", tabName = "3", icon = icon("atlas")), + #menuItem("Ingestion", tabName = "3", icon = icon("utensils")), selectInput("modelSelect", "Select MESO model", choices=c(""), selected=NULL, multiple=FALSE), - selectInput("layerSelect", "Select Transition", - choices=transitions, - selected=NULL, multiple=FALSE) + uiOutput("pressureList") + #selectInput("layerSelect", "Select Transition", + # choices=transitions, + # selected=NULL, multiple=FALSE) ) ), dashboardBody( tabItems( - tabItem(tabName = "1", - fluidRow( - column(width=2, - h4('Pressure Test'), - actionButton("calcAB", "Calc"), - uiOutput("pressureList") + tabItem(tabName = "1", h2('Impact Distribution'), + fluidRow( + column( + width=6, + h4('Effect on bio-assemblage') ), - column(width=10, - h4('Effect on bio-assemblage'), - plotlyOutput("layer1", height="270px") %>% withSpinner(), - h4('Effect on Output Processes'), - plotlyOutput("layer2", height="270px") %>% withSpinner(), - h4('Effect on Ecosystem services'), - plotlyOutput("layer3", height="270px") %>% withSpinner() + column( + width=6, + actionButton("layer1Slider", "1", icon=icon("sliders-h")) ) - ) + ), + plotlyOutput("layer1", height="270px") %>% withSpinner(), + h4('Effect on Output Processes'), + plotlyOutput("layer2", height="270px") %>% withSpinner(), + h4('Effect on Ecosystem services'), + plotlyOutput("layer3", height="270px") %>% withSpinner() ), - tabItem(tabName = "2",h4("Bayesian Network"), + tabItem(tabName = "2",h2("Bayesian Network"), fluidPage( + p('Graphical output of the Bayesian Network. Note: large networks may never stabilise!'), fluidRow( - plotOutput("bbnGraphPlot") + column( + width=4, + checkboxInput("bbnDisplayNames", "Display Node names", value=FALSE) + ), + column( + width=4, + selectInput("bbnImpactSelect", "Impact Threshold", choices=impacts, selected='All') + ) + ), + fluidRow( + visNetworkOutput("bbnGraphPlot") ), fluidRow( column( @@ -80,12 +136,12 @@ ui<-dashboardPage( ) ) ), - tabItem(tabName = "3",h4("Habitats"), - fluidPage( - google_mapOutput(outputId = "map", width = "100%", height = "750px") - ) - ), - tabItem(tabName = "4",h4("Ingestion"), + #tabItem(tabName = "3",h4("Habitats"), + # fluidPage( + # google_mapOutput(outputId = "map", width = "100%", height = "750px") + # ) + #), + tabItem(tabName = "3",h4("Ingestion"), fluidPage( p("Select a spreadsheet from your network for input into the JNCC Bayesian Network Analyser:"), fileInput("fileSelect", "Choose Excel Spreadsheet File (xlsx format)", multiple = FALSE, accept = "xlsx"), @@ -102,12 +158,13 @@ server <- function(input, output, session) { print('Loading data') - set_key("AIzaSyAw8_btgGN1drf8qhCxNcotP6r11qEXA_M") + #set_key("AIzaSyAw8_btgGN1drf8qhCxNcotP6r11qEXA_M") dataStorage <- 'data/' models<-NULL pressures <- NULL + #disable(input$loadAb) .loadStatus <- reactiveValues( @@ -140,11 +197,11 @@ server <- function(input, output, session) { for (idx in 1:length(fileList)) { print(paste('attempting to load', paste0(dataStorage, fileList[idx]))) + tmp <- parser$parseSheet(paste0(dataStorage, fileList[idx])) - + if (!is.null(tmp)) { modelList[[cnt]] <- tmp - models <<- c(models, substr(fileList[idx], 1, (nchar(fileList[idx])-5))) print(paste('Model file successfully loaded', fileList[idx])) cnt=cnt+1 @@ -158,37 +215,24 @@ server <- function(input, output, session) { } - .selections <- reactiveValues(model=1, layer=1) + .selections <- reactiveValues( + model=1, + layer=1, + bbnImpact=1, + bbnNames=FALSE, + pressStatus=NULL + ) #parse on load sheets in the input sheet folder - replace with R Data modelList <- getAvailableModels() - calcLikelihood <- function(layer, pressStatus) { + calcLikelihood <- function(layer, pressStatus, confLevels) { - # isolate({ - # if (layer==1) layerStr='ba' else if (layer==2) layerStr='op' else layerStr ='es' - # nodeList <- modelList[[.selections$model]][[.selections$layer]]$nodes - # str(nodeList) - # nodeNames <- nodeList$name[startsWith(nodeList$code, layerStr)] - # mean = runif(length(nodeNames), min=-1, max=1) - # sd = runif(length(nodeNames), min=-0.25, max=0.25) - # - # df <- data.frame( - # nodeNames = nodeNames, - # range = c((mean - (3*sd)), (mean - (2*sd)), (mean - sd), mean, - # (mean + sd), (mean + (2*sd)), (mean + (3*sd))), - # stringsAsFactors=FALSE - # ) - # print(df) - # }) - # return( - # df - # ) isolate({ if (layer==1) layerStr='ba' else if (layer==2) layerStr='op' else if (layer==3) layerStr='es' - layerRange <- which(startsWith(modelList[[.selections$model]][[layer]]$nodes$code, layerStr)) + layerRange <- which(startsWith(modelList[[.selections$model]][[3]]$nodes$code, layerStr)) nodeCodes <- modelList[[.selections$model]][[layer]]$nodes$code[layerRange] nodeNames <- modelList[[.selections$model]][[layer]]$nodes$name[layerRange] @@ -196,21 +240,6 @@ server <- function(input, output, session) { MEANPOS=1 MEANNEG=0 - # expr <- "(" - # for (p in 1:nrow(pressStatus)) { - # if (pressStatus$status[p] == 'On') { - # threshold = MEANPOS - # } else { - # threshold = MEANNEG - # } - # - # expr <- paste0(expr, "(\"", pressStatus$code[p], "\">=", threshold, ") & ") - # } - # expr <-substr(expr, 1, nchar(expr)-2) - # expr<-paste0(expr, ')') - # - # print(expr) - expr <- "list(" for (p in 1:nrow(pressStatus)) { if (pressStatus$status[p] == 'On') { @@ -224,11 +253,9 @@ server <- function(input, output, session) { expr <-substr(expr, 1, nchar(expr)-2) expr<-paste0(expr, ')') - print(expr) - #txtStringWkg = "((\"p1\">=0.5) & (\"p10\">=0.5) & (\"p2\">=0.5))" - - print(bnlearn::nodes(modelList[[.selections$model]][[layer]]$cfit)) + #build the graph + #parser$buildGraph(p_es, desc=list(inputCode='p', outputCodes=c('ba', 'op', 'es'))) sampleDists <- cpdist( fitted = modelList[[.selections$model]][[layer]]$cfit, @@ -240,21 +267,12 @@ server <- function(input, output, session) { ) }) - #print (sum(res[, 1] * attr(res, "weights")) / sum(attr(res, "weights"))) - - print("Sample dists") - print(sampleDists) - - print("Weights") - print(unique(attr(sampleDists, "weights"))) displayCols <- match(nodeCodes, colnames(sampleDists)) sampleDists <- sampleDists[,displayCols] means <- apply(sampleDists, 2, mean) stdDev <- apply(sampleDists, 2, sd) - print(modelList[[.selections$model]][[layer]]$nodes$name) - - return(data.frame( + return(data.frame( nodeNames = nodeNames, range = c( apply(sampleDists, 2, min), @@ -289,53 +307,63 @@ server <- function(input, output, session) { column(width=3, icon(renderStatus(2))), column(width=3, icon(renderStatus(3))), column(width=3, icon(renderStatus(4))) - )#, - #fluidRow( - # verbatimTextOutput("msgBoard", .loadStatus$msg, placeholder=TRUE) - #) + ) ) }) - - observeEvent(input$loadAB, { - #TO DO get spreadsheet - #copy validated sheet into the data folder and either add or replace the sheet in the RData file - #reload the RData file - print('Load button pressed') - }) - + observeEvent(input$modelSelect, { .selections$model <<- match(input$modelSelect, models) }) - observeEvent(input$layerSelect, { - .selections$layer <<- match(input$layerSelect, transitions) - }) + #observeEvent(input$layerSelect, { + # .selections$layer <<- match(input$layerSelect, transitions) + #}) - - observeEvent(input$calcAB, { - #get the status of action buttons + observeEvent(reactiveValuesToList(input), { isolate(myList <- reactiveValuesToList(input)) matches <- match(pressures$code, names(myList)) - status <-NULL - for (n in 1:length(matches)) status[n] = myList[[matches[n]]] - - pressStatus <- data.frame(code=pressures$code, status=status, stringsAsFactors = FALSE) - - .likelihoods$p_ba <<- calcLikelihood(1, pressStatus) - .likelihoods$ba_os <<- calcLikelihood(2, pressStatus) - .likelihoods$os_es <<- calcLikelihood(3, pressStatus) + if (length(matches)>0) { + status <-NULL + for (n in 1:length(matches)) status[n] = myList[[matches[n]]] + + newStatus <- data.frame(code=pressures$code, status=status, stringsAsFactors = FALSE) + + if (!identical(newStatus, .selections$pressStatus)) { + print('Running calc') + .likelihoods$p_ba <<- calcLikelihood(1, newStatus) + .likelihoods$ba_os <<- calcLikelihood(2, newStatus) + .likelihoods$os_es <<- calcLikelihood(3, newStatus) + + .selections$pressStatus <<- newStatus + } + + } + sliderControls <- c("l1VH", "l1H", "l1M", "l1L", "l1VL", "l1Conf") + matches <- match(sliderControls, names(myList)) + if (length(matches)>0) { + print(matches) + } }) - output$map <- renderGoogle_map({ - google_map(location = c(55, 0), zoom = 7) - }) + #output$map <- renderGoogle_map({ + # google_map(location = c(55, 0), zoom = 7) + #}) makeRadioButtons <- function(row) { radioButtons(row['code'], row['name'], choices=c('Off', 'On'), selected='Off', inline=TRUE) } + output$linkBackgroundData <- downloadHandler( + filename = "JNCC MESO.xlsx", + content = function(file) { + file.copy("JNCC MESO.xlsx", file) + }, + contentType = "application/xlsx" + ) + + output$pressureList <- renderUI({ #isolate({ if (!is.null(modelList[[.selections$model]][[1]]$nodes)) { @@ -347,6 +375,36 @@ server <- function(input, output, session) { } }) + observeEvent(input$bbnImpactSelect, { + #filter nodes and edges to + .selections$bbnImpact <- thresholds[match(input$bbnImpactSelect, impacts)] + print(paste("Setting bbn impact", .selections$bbnImpact)) + }) + + observeEvent(input$bbnDisplayNames, { + .selections$bbnNames <- input$bbnDisplayNames + print(.selections$bbnNames) + }) + + observeEvent(input$layer1Slider, { + showModal( + modalDialog({ + tagList( + sliderInput("l1VH", "Very High Sensitivity", 0.9, 1.0, 0.99, step=0.01), + sliderInput("l1H", "High Sensitivity", 0.75, 1.0, 0.95, step=0.01), + sliderInput("l1M", "Medium Sensitivity", 0.5, 0.75, 0.95, step=0.01), + sliderInput("l1L", "Low Sensitivity", 0.15, 0.5, 0.2, step=0.01), + sliderInput("l1VL", "Very Low Sensitivity", 0.01, 0.2, 0.15, step=0.01), + sliderInput("pressStdDev", "Pressure SD", 0.1, 1, 0.5, step=0.1), + sliderInput("baStdDev", "Bio-Assemblage SD", 0.1, 1, 0.5, step=0.1) + ) + }, title='Layer 1 controls', size='s') + ) + }) + + + + output$nodeTable <- DT::renderDataTable( @@ -360,31 +418,133 @@ server <- function(input, output, session) { selection = 'single',options = list(searching = TRUE, pageLength = 10, editable=TRUE),server = TRUE, escape = FALSE,rownames= TRUE ) - output$bbnGraphPlot <- renderPlot({ - graphviz.plot(modelList[[.selections$model]][[.selections$layer]]$net) + getLabel <- function(impact) { + sign <- ifelse(impact<0, "-", "+") + idx <- min(which((abs(impact)>=thresholds)==TRUE)) + return(paste0(sign, impLabels[idx])) + } + + getLevels <- function(code) { + if (startsWith(code, 'p')) return(1) + else if (startsWith(code, 'ba')) return(2) + else if (startsWith(code, 'op')) return(3) + else if (startsWith(code, 'es')) return(4) + else return(5) + } + + + output$bbnGraphPlot <- renderVisNetwork({ + #graphviz.plot(modelList[[.selections$model]][[.selections$layer]]$net) + + nodes <- modelList[[.selections$model]][[.selections$layer]]$nodes + + edges <- data.frame( + id = rownames(modelList[[.selections$model]][[.selections$layer]]$edges), + from=match(modelList[[.selections$model]][[.selections$layer]]$edges$input, nodes$name), + to=match(modelList[[.selections$model]][[.selections$layer]]$edges$output, nodes$name), + impact=modelList[[.selections$model]][[.selections$layer]]$edges$impact, + label=sapply(modelList[[.selections$model]][[.selections$layer]]$edges$impact, getLabel), + arrows="to", + stringsAsFactors=FALSE + ) + if (.selections$bbnNames) {labels <- nodes$name} else {labels <- nodes$code} + + nodeSpacing <- ifelse(.selections$bbnNames, 600, 150) + + nodes <- data.frame( + id = rownames(nodes), + label = labels, + level = sapply(nodes$code, getLevels), + code = nodes$code, + stringsAsFactors=FALSE + ) + + + + edges <- edges[(abs(edges$impact)>=.selections$bbnImpact),] + + nodeNet <- nodes[(nodes$code %in% .selections$pressStatus$code[.selections$pressStatus$status %in% c('On')]),] + + save(nodes, edges, nodeNet, file = 'tmp.RData') + + + if (nrow(nodeNet)>0) { + + #do pressures + edgeNet <- edges[edges$from %in% nodeNet$id, ] + idx = 1 + repeat { + nodesToAdd <- nodes[nodes$id %in% edgeNet$to, ] + nodesToAdd <- nodesToAdd[!(nodesToAdd$id %in% nodeNet$id),] + + edgesToAdd <- edges[edges$from %in% nodesToAdd$id, ] + edgesToAdd <- edgesToAdd[!(edgesToAdd$id %in% edgeNet$id),] + + idx <- idx + 1 + if ((idx>20) || ((nrow(nodesToAdd)==0) && (nrow(edgesToAdd)==0))) break + nodeNet <- rbind(nodeNet, nodesToAdd) + edgeNet <- rbind(edgeNet, edgesToAdd) + + } #until finished + } else edgeNet <- edges + + visNetwork(nodeNet, edgeNet, width = "100%") %>% + visHierarchicalLayout(nodeSpacing=nodeSpacing) %>% + visOptions(highlightNearest = TRUE) %>% + #visPhysics(hierarchicalRepulsion = nodeSpacing) %>% + visInteraction(navigationButtons = TRUE, dragNodes = TRUE, dragView = TRUE, zoomView = TRUE) }) + observe({ + visNetworkProxy("bbnGraphPlot") %>% + visStabilize(iterations=10) + }) + + output$layer1 <- renderPlotly({ if (length(.likelihoods$p_ba)>0) { + + .likelihoods$p_ba$nodeNames <- factor(.likelihoods$p_ba$nodeNames, levels = unique(.likelihoods$p_ba$nodeNames)) + + xform <- list(categoryorder = "array", + categoryarray = .likelihoods$p_ba$nodeNames, + zerolinewidth=10) + plot_ly(.likelihoods$p_ba, y = ~range, color = ~nodeNames, type = "box") %>% - layout(xaxis = list(zerolinewidth=2)) + layout(xaxis = xform) } }) output$layer2 <- renderPlotly({ - if (.selections$layer>1) { + if (length(.likelihoods$ba_os)>0) { + + .likelihoods$ba_os$nodeNames <- factor(.likelihoods$ba_os$nodeNames, levels = unique(.likelihoods$ba_os$nodeNames)) + + xform <- list(categoryorder = "array", + categoryarray = .likelihoods$ba_os$nodeNames, + zerolinewidth=5) + + plot_ly(.likelihoods$ba_os, y = ~range, color = ~nodeNames, type = "box") %>% - layout(xaxis = list(zerolinewidth=2)) + layout(xaxis = xform) } }) output$layer3 <- renderPlotly({ - if (.selections$layer>2) { + if (length(.likelihoods$os_es)>0) { + + .likelihoods$os_es$nodeNames <- factor(.likelihoods$os_es$nodeNames, levels = unique(.likelihoods$os_es$nodeNames)) + + xform <- list(categoryorder = "array", + categoryarray = .likelihoods$os_es$nodeNames, + zerolinewidth=5) + + plot_ly(.likelihoods$os_es, y = ~range, color = ~nodeNames, type = "box") %>% - layout(xaxis = list(zerolinewidth=2)) + layout(xaxis = xform) } }) diff --git a/data/Sub_littoral_sand.xlsx b/data/Sub_littoral_sand.xlsx deleted file mode 100644 index d979787f6a2fd8df4f5392429a6099178eb9170e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22902 zcmeEtRdgKLlC79*v1BnbGcz+YGcz+;P-3zqTWm2ivn-ayj3t)E%>3l;xifeA_I>mB ze&*H6Rg_T?d&k*v@UKon(s^ljLqlU z%2Is;+)cMHe z7R|7TyI;NDRj`@{LVhh=AvBODLAj(HdTfO!z(HD*VTw4`x?D;)%0D&eb6k zI+QMyhQxi}Tc?&+o!qHBzqhQS*Ty#HD_AYn)n@3ykkCS;zjoJswR=L7$*EJF85I}I z$X9N6LW#W~*m981>R#9`WBCuk0ou{5@WH6TvrjTTcwAu?Jx+e)xEybN$Xk36X<35= zF{CaVgocZh-Kb}c$b37xOo&@__un)rpzkYy1ITArvpN8#C0^IF9uJ7QIX;ZgZfMvF zqU&u;lbW_oc{riWHZV~Qht593o2lEFQGAy)f97q5ccHz#frBXiw`wK7Io|?%uh#YV zV*K!4tp?6!wk{0xzn}kqmHsa-&3~d^o+u{+&V&?p_W6xyXD!nX9oec81KAr@D?m`z zTwqa-oKyw)>H|*Ps@R0@ol)hH<&}D3@0{m3_|5xLx-v=`?mEo&Ooz0=upJ`an&9A}lhms4vv>rj?5H&y55)%MA(3IPi8y#(OPg-QkYTU?{$dYCMlaWe_ z2U38|kaZ!|t@?0t6NmEbU_3|mLSf+nJbxk==e4gf>u?U2S5@ zsEa(sBoP{xPLEaYiVRAsh_UksuK}NoVnBDV*1@>m}*10$ z9h3<2#Nrp8&LG3vlsSsOEt!XlpZ2KlC1V5u0)hlnHfIp|&g6AU*hRNIJ}EQrhdCJ$87| zpWB$0V9Z0-p1yfm*1cF;I|)l9v%%#OLIjaFXqmx55oJzBen`+0XC&uYoJIm(u}`S zIkwq?8m~93Jp|aL@2N#Hu=BB7-baQ$*PjZK5&I~ez?njdM41NE!SFH-9WjpJ^wJg? z;_rnRbusZO6fl?th^u@oFYS7bZ@^^O@ngat(xnFK`fR>>+;`5L z2{31ct}qoBg$dAVhtdS%*(VYLiOZ=F~R9?Z4kUQk(|@O3Jy^lt=PX6}5bN z1$zip;@py!TCxyaI=(FcZA&b@I-D*eGYqwDZ$R$#6+eHuVf{g`50!%hp>7 zUKUb*`uHtJ8T_pT@%z*jDc)D`1Ee4znExd~7fUlUR~LpqURZxmY)NT)E_ux;VP{R& zZ{WL8E)5az5a4uiqBbTnn{oWP0eqkh>Dd8?WU1%2a2CVv`a zN%b5;^m^%F;+}~;&^vdf{<*U$xa~jVkeIY${|b6F$V(Sh>RDbjyxQ)DHt5UKmHDLr z=$<_Tqq*3??9-m@H+yDm!j^v4C>QuTTDM^BSTQ%;`}H`!z^$=}cZ~JZ8zA@oX9#Ex zWNJA!C`)R-+bdmNZSSW4rwYo@0FKN_GB-vHzK>O24)$Ma6bf$RRa4b)Uw_`+u((OF zm}K*jGXPov=|^MJnzU})!OagXo;P*R2Q7u

|96C-!f^@zNxefoD?0=`BIvRGIte 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 a1E94^fHx~J!80)M0pVm|o;e!|;sF3)MmgvJ diff --git a/data/Sub_littoral_sand_BA.xlsx b/data/Sub_littoral_sand_BA.xlsx deleted file mode 100644 index 54deb058223f130cc22663751274081db92c836e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23869 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 MEaRMsv-t1mUz3{Vq5uE@