R/app.R

#' @title Eagle Model GUI User Interface
#' @author Joe Statwick
#'
#' @description The UI portion of the shiny interface for EagleModelGUI
#' @import shiny

# Define UI for application
EagleModelui <- fluidPage(

    # Application title
    titlePanel("Eagle Fatality Estimate"),

    # Sidebar with a slider input for number of bins 
    sidebarLayout(
        sidebarPanel(
            textInput("cProject", "Name of project"),
            textInput("Name", "Your name"),
            numericInput("nTurbine","Number of turbines", value = ""),
            numericInput("DayLtHr","Annual Daylight Hours", value = ""),
            helpText("You can use DayLen() to calculate this if you don't know"),
            fluidRow(
                column(8,numericInput("TDiam","Blade diameter of one turbine", value = "")),
                column(2,radioButtons("Tunits", h5("Units"),
                             choices = list("Meters" = 1, "Feet" = 2),
                                            selected = 1))),
            radioButtons("opr", "Do know the facility operative rate?", c("Yes"=1,"No"=0),selected = 0, inline = TRUE),
            conditionalPanel(
                condition = "input.opr == 1",
                numericInput("Oprate","Facility operative rate", value = 1, min = 0, max = 1)),
            radioButtons("prec", "Do have pre-construction eagle use data?", c("Yes"=1,"No"=0),selected = 0, inline = TRUE),
            conditionalPanel(
                condition = "input.prec == 1",
                radioButtons("strata", "Do you have multiple strata?", c("Yes"=1,"No"=0),selected = 0, inline = TRUE),
                conditionalPanel(
                    condition = "input.strata == 1",
                    helpText(tags$span(style="color:red", "Please use EagleModel(); multiple strata not yet supported"))),
                    numericInput("EMin","Number of eagle-minutes", value = "", step = 1),
                fluidRow(
                    column(6,numericInput("nCnt","Number of observation trials", value = "", step = 1)),
                    column(6,numericInput("CntMin","Duration of one trial (minutes)", value = "", step = 1))),
                fluidRow(
                    column(8,numericInput("Pradius","Radius of one observation plot", value = "")),
                    column(2,radioButtons("Punits", h5("Units"),
                                          choices = list("Meters" = 1, "Feet" = 2),
                                          selected = 1)))),
            radioButtons("pcmm", "Do have post-construction mortality monitoring data?", c("Yes"=1,"No"=0),selected = 0, inline = TRUE),
            conditionalPanel(
                condition = "input.pcmm == 1",
                fluidRow(
                    column(6,numericInput("carcasses","Number of carcasses found", value = "", step = 1)),
                    column(6, numericInput("PCMMsurveys","Number of turbines surveyed", value = "", step = 1))),
                fluidRow(
                    column(6,numericInput("FatEfficiency","Searcher efficiency", value = 1, min = 0, max = 1)),
                    column(6,numericInput("FatRemoval","Carcass Persistance at search interval", value = .76, min = 0, max = 1))),
                numericInput("PCMMhrs","Daylight hours during PCMM surveys", value = "")
                ),
            radioButtons("CPrPriors", "Which collision priors would you like to use?", c("USFWS"="USFWS","Bay, 2016"="Bay", "Custom" = "Custom"),selected = "USFWS"),
            conditionalPanel(
                condition = "input.CPrPriors == 'Custom'",
                fluidRow(
                    column(6,numericInput("aPriCpr","Alpha parameter", value = NULL)),
                    column(6,numericInput("bPriCpr","Beta parameter", value = NULL)))),
            sliderInput("percentile", "Estimate percentile", min = 5, max = 95, value = 80, step = 5)
        ),

        # Show a plot of the generated distribution
        mainPanel(
           verbatimTextOutput("value"),
           plotOutput("fatalPlot")
        )
    )
)

#' @title Eagle Model GUI Server Side
#' @author Joe Statwick
#'
#' @description The server portion of the shiny interface for EagleModelGUI
#' @import shiny
#' @import rv

EagleModelserver <- function(input, output) {
    
    Fatalities <- reactive({
        req(input$TDiam, input$nTurbine, input$DayLtHr, input$Oprate, (input$prec != 1 || (isTruthy(input$EMin) && isTruthy(input$nCnt) && isTruthy(input$CntMin) && isTruthy(input$Pradius))), (input$pcmm != 1 || (isTruthy(input$carcasses) && isTruthy(input$FatEfficiency) && isTruthy(input$FatRemoval))))
        if (input$Tunits == "2") {HazDiam <- input$TDiam*0.3048
        } else {HazDiam <- input$TDiam}
        HazKM2 <- input$nTurbine*pi*(HazDiam/2/1000)^2
        if (input$Punits == "2") {Pradius <- input$Pradius*0.3048
        } else {Pradius <- input$Pradius}
        CntKM2 <- pi*(Pradius/1000)^2
        CntHr <- input$CntMin/60
        if (input$prec == "1") {
            EMin <- input$EMin
            SmpHrKM2 <- input$nCnt*CntHr*CntKM2
        } else {
            EMin <- -1
            SmpHrKM2 <- 1
        }
        if (input$pcmm == "1") {
            EOutMin <- FatEst(input$carcasses,input$FatEfficiency,input$FatRemoval)
            CprHrKM2 <- (input$PCMMsurveys*input$PCMMhrs)*HazKM2/input$nTurbine*input$Oprate
        } else {
            EOutMin <- -1
            CprHrKM2 <- 1
        }
        
        ExpFac <- input$DayLtHr*HazKM2*input$Oprate
        UCI <- c(0.5,0.8,0.9,0.95)
        nSim <- 100000
        setnsims(nSim)
        
        Fatalities <- simFatalCPr(EMin, EOutMin, SmpHrKM2, CprHrKM2, ExpFac, CPrPriors = input$CPrPriors, aPriExp = 0.9776543, bPriExp = 2.777427, aPriCPr = input$aPriCPr, bPriCPr = input$bPriCPr)
        return(Fatalities)
    })
    
    output$value <- renderText({
        req(Fatalities())
        estimate<-rvquantile(Fatalities(),probs=(input$percentile/100))
        fiveyear<-ceiling(estimate*5)
        return(paste0("Project name: ",input$cProject,"\nModeled by: ",input$Name,"\nDate: ",date(),"\nThe ",input$percentile,"th percentile estimate is ",round(estimate,3)," eagle fatalities annually.\nThe five-year fatality estimate is:",fiveyear))
        })
    
    output$fatalPlot <- renderPlot({
    req(Fatalities())
    plotFatal(Fatalities(), probs = input$percentile/100)
    })
}

#' @title Eagle Model GUI
#' @author Joe Statwick (Arcadis)
#'
#' @description A graphical user interface for calculating the estimated number of annual eagle fatalities at a wind power facility. For more flexibility of data inputs (at the cost of user-friendliness) try EagleModel() instead.
#' @seealso EagleModel()
#' @export
#' @import shiny
#' @import rv

# Run the application via function
EagleModelGUI<-function(){
shinyApp(ui = EagleModelui, server = EagleModelserver)}


#run the application via Rstudio
shinyApp(ui = EagleModelui, server = EagleModelserver)
josephstatwick/EagleModelCalc documentation built on May 16, 2019, 4:55 p.m.