An error occurred while loading the file. Please try again.
-
Delaigue Olivier authored4f272a7b
# server.R
shinyServer(function(input, output, session) {
## --------------- List of input names
getInputs <- reactive({
inputList <- sort(names(reactiveValuesToList(input)))
inputList <- inputList[!grepl("^dy", inputList)]
inputList <- inputList[!grepl("^CalButton", inputList)]
inputList <- c(inputList, "DownloadTab", "DownloadPlot")
return(inputList)
})
## Models available considering the plot type
observeEvent(input$Dataset, {
if (is.null(.ShinyGR.args$ObsDF[[input$Dataset]])) {
datesDataset <- .ShinyGR.args$DatesR[1:2]
} else{
datesDataset <- .ShinyGR.args$ObsDF[[input$Dataset]]$DatesR[1:2]
}
nbDaysDataset <- as.numeric(diff(datesDataset), units = "days")
if (nbDaysDataset %in% 29:31) {
print("months")
updateSelectInput(session, inputId = "HydroModel", choice = c("GR2M"), selected = "GR2M")
updateSelectInput(session, inputId = "SnowModel" , choice = c("None"))
} else {
print("days")
if (input$HydroModel == "GR2M") {
HydroModel <- "GR4J"
} else {
HydroModel <- input$HydroModel
}
updateSelectInput(session, inputId = "HydroModel", choice = c("GR4J", "GR5J", "GR6J"), selected = HydroModel)
updateSelectInput(session, inputId = "SnowModel" , choice = c("None", "CemaNeige") , selected = input$SnowModel)
}
}, priority = -100)
## --------------- Data preparation
getPrep <- reactive({
if (input$Dataset == "Unnamed watershed") {
ObsDF <- NULL
} else {
# ObsDF <- get(input$Dataset)
ObsDF <- .ShinyGR.args$ObsDF[[input$Dataset]]
}
if (!all(is.na(ObsDF[[4]])) | !all(is.na(.ShinyGR.args$Qobs))) {
isUngauged <- FALSE
} else {
isUngauged <- TRUE
}
if (is.null(ObsDF)) {
datesDataset <- .ShinyGR.args$DatesR[1:2]
} else{
datesDataset <- .ShinyGR.args$ObsDF[[input$Dataset]]$DatesR[1:2]
}
nbDaysDataset <- as.numeric(diff(datesDataset), units = "days")
if (nbDaysDataset %in% 29:31) {
HydroModel <- "GR2M"
} else if (input$HydroModel == "GR2M") {
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
updateSelectInput(session, inputId = "HydroModel", choice = c("GR4J", "GR5J", "GR6J"), selected = input$HydroModel)
HydroModel <- "GR4J"
} else {
HydroModel <- input$HydroModel
}
TMGR <- .TypeModelGR(HydroModel)
X2 <- ifelse(input$HydroModel == "GR2M", input$X2GR2M, input$X2)
PARAM <- c(input$X1, X2, input$X3, input$X4, input$X5, input$X6)[seq_len(TMGR$NbParam)]
if (input$SnowModel == "CemaNeige") {
PARAM <- c(PARAM, input$C1, input$C2)
}
PREP <- PrepGR(ObsDF = ObsDF,
DatesR = .ShinyGR.args$DatesR,
Precip = .ShinyGR.args$Precip, PotEvap = .ShinyGR.args$PotEvap,
Qobs = .ShinyGR.args$Qobs, TempMean = .ShinyGR.args$TempMean,
ZInputs = .ShinyGR.args$ZInputs[[input$Dataset]],
HypsoData = .ShinyGR.args$HypsoData[[input$Dataset]],
NLayers = .ShinyGR.args$NLayers[[input$Dataset]],
HydroModel = HydroModel,
CemaNeige = input$SnowModel == "CemaNeige")
## old value: bad time zone management
#WUPPER <- c(PREP$InputsModel$DatesR[1L], input$Period[1]-.TypeModelGR(PREP)$TimeLag)
## patch from Juan Camilo Peña <juancamilopec@gmail.com>
#WUPPER <- c(format(PREP$InputsModel$DatesR[1L], format = "%Y-%m-%d", tz = "UTC"), format(input$Period[1]-.TypeModelGR(PREP)$TimeLag, format = "%Y-%m-%d", tz = "UTC"))
## new value
WUPPER <- as.POSIXlt(c(as.character(PREP$InputsModel$DatesR[1L]), as.character(input$Period[1]-.TypeModelGR(PREP)$TimeLag)), tz = "UTC")
if (HydroModel == "GR2M") {
WUPPER <- trunc(WUPPER, units = "months")
} else {
WUPPER <- trunc(WUPPER, units = "days")
}
if (WUPPER[2] < WUPPER[1]) {
WUPPER[2] <- WUPPER[1]
}
## Enable or disable automatic calibration (if there is Qobs or not)
isQobs <- !all(is.na(PREP$Qobs[PREP$InputsModel$Dates >= input$Period[1] & PREP$InputsModel$Dates <= input$Period[2]]))
# if ( isQobs | input$Period[1L] != input$Period[2L]) {
# shinyjs::enable("CalButton")
# }
if (!isQobs | input$Period[1L] == input$Period[2L]) {
shinyjs::disable("CalButton")
}
return(list(TMGR = TMGR, PREP = PREP, WUPPER = WUPPER, isUngauged = isUngauged))
})
## --------------- Calibration
## If the user calibrate the model
CAL_click <- reactiveValues(valueButton = 0)
## Automatic calibration
observeEvent(input$CalButton, {
## Desable all inputs during automatic calibration
lapply(getInputs(), shinyjs::disable)
shinyjs::disable("CalButton")
## Model calibration
CAL_opt <- list(Crit = gsub(" .*", "", input$TypeCrit),
Transfo = gsub("1", "inv", gsub("(\\D{3} \\[)(\\w{0,4})(\\W*Q\\W*\\])", "\\2", input$TypeCrit)))
CAL <- CalGR(PrepGR = getPrep()$PREP, CalCrit = CAL_opt$Crit, transfo = CAL_opt$Transfo,
WupPer = substr(getPrep()$WUPPER, 1, 10),
CalPer = c(substr(input$Period[1], 1, 10), substr(input$Period[2], 1, 10)),
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
verbose = FALSE)
PARAM <- CAL$OutputsCalib$ParamFinalR
updateSliderInput(session, inputId = "X1", value = PARAM[1L])
if (input$HydroModel == "GR2M") {
updateSliderInput(session, inputId = "X2GR2M", value = PARAM[2L])
}
if (input$HydroModel %in% c("GR4J", "GR5J", "GR6J")) {
updateSliderInput(session, inputId = "X2", value = PARAM[2L])
updateSliderInput(session, inputId = "X3", value = PARAM[3L])
updateSliderInput(session, inputId = "X4", value = PARAM[4L])
}
if (input$HydroModel %in% c("GR5J", "GR6J")) {
updateSliderInput(session, inputId = "X5", value = PARAM[5L])
}
if (input$HydroModel %in% "GR6J") {
updateSliderInput(session, inputId = "X6", value = PARAM[6L])
}
if (input$SnowModel == "CemaNeige") {
updateSliderInput(session, inputId = "C1", value = PARAM[length(PARAM)-1])
updateSliderInput(session, inputId = "C2", value = PARAM[length(PARAM)])
}
updateActionButton(session, inputId = "CalButton", label = "Model calibrated", icon = icon("check"))
CAL_click$valueButton <- 1
shinyjs::disable("CalButton")
## Enable calibration
# if (input$Period[1L] != input$Period[2L]) {
# lapply(getInputs(), shinyjs::enable)
# shinyjs::enable("CalButton")
# }
}, priority = +20)
## Manual calibration
observeEvent({input$Dataset ; input$HydroModel ; input$SnowModel ;
input$X1 ; input$X2 ; input$X2GR2M ; input$X3 ; input$X4 ; input$X5 ; input$X6 ; input$C1 ; input$C2 ;
input$TypeCrit ; input$Period}, {
CAL_click$valueButton <- CAL_click$valueButton - 1
CAL_click$valueButton <- ifelse(CAL_click$valueButton < -1, -1, CAL_click$valueButton)
if (CAL_click$valueButton < 0) {
updateActionButton(session, inputId = "CalButton", label = "Run", icon = icon("refresh"))
if (!getPrep()$isUngauged) {
shinyjs::enable("CalButton")
}
}
## Enable all inputs except automatic calibration
if (input$Period[1L] != input$Period[2L]) {
lapply(getInputs(), shinyjs::enable)
if (getPrep()$isUngauged) {
shinyjs::disable("CalButton")
shinyjs::disable("TypeCrit")
}
}
## Disable the use of CemaNeige is there is no temperature
if (!is.null(.ShinyGR.args$ObsDF[[input$Dataset]])) {
if (ncol(.ShinyGR.args$ObsDF[[input$Dataset]]) < 5) {
shinyjs::disable("SnowModel")
}
} else {
if (is.null(.ShinyGR.args$TempMean)) {
shinyjs::disable("SnowModel")
}
}
})
## --------------- Simulation
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
getSim <- reactive({
X2 <- ifelse(input$HydroModel == "GR2M", input$X2GR2M, input$X2)
PARAM <- c(input$X1, X2, input$X3, input$X4, input$X5, input$X6)[seq_len(getPrep()$TMGR$NbParam)]
if (input$SnowModel == "CemaNeige") {
PARAM <- c(PARAM, input$C1, input$C2)
}
## Simulated flows computation
PREP <- getPrep()$PREP
if (input$HydroModel == "GR2M") {
dd <- trunc(input$Period, units = "months")
} else {
dd <- trunc(input$Period, units = "days")
}
SIM <- SimGR(PrepGR = PREP, Param = PARAM,
WupPer = substr(getPrep()$WUPPER, 1, 10),
SimPer = c(substr(dd[1], 1, 10), substr(dd[2], 1, 10)),
verbose = FALSE)
## Criteria computation
CRIT_opt <- list(Crit = c(rep("ErrorCrit_NSE", 3), rep("ErrorCrit_KGE", 3)),
Transfo = rep(c("", "sqrt", "inv"), times = 2))
nCRIT_opt <- length(CRIT_opt$Crit)
if (!getPrep()$isUngauged) {
InputsCritMulti <- CreateInputsCrit(FUN_CRIT = CRIT_opt$Crit,
InputsModel = getPrep()$PREP$InputsModel,
RunOptions = SIM$OptionsSimul,
Obs = replicate(n = nCRIT_opt, expr = SIM$Qobs, simplify = FALSE),
VarObs = rep("Q", times = nCRIT_opt),
transfo = CRIT_opt$Transfo,
Weights = NULL)
iCRIT <- ErrorCrit(InputsCrit = InputsCritMulti, OutputsModel = SIM$OutputsModel, verbose = FALSE)
CRIT <- do.call("rbind", lapply(iCRIT, function(i) data.frame(CritName = i$CritName, CritValue = i$CritValue)))
CRIT <- rbind(CRIT, data.frame(CritName = "BIAS[Qsim/Qobs]",
CritValue = ifelse(is.na(iCRIT[[which(CRIT$CritName == "KGE[Q]")]]$CritValue),
NA,
iCRIT[[which(CRIT$CritName == "KGE[Q]")]]$SubCritValues[3])))
colnames(CRIT) <- c("Criterion", "Value")
} else {
CRIT <- data.frame(Criterion = NA, Value = NA)
}
## Recording past simulations
.GlobalEnv$.ShinyGR.hist[[length(.GlobalEnv$.ShinyGR.hist)+1]] <- list(Qsim = SIM$OutputsModel$Qsim,
Param = PARAM,
TypeModel = SIM$TypeModel,
Crit = CRIT,
Dataset = input$Dataset,
Period = SIM$PeriodModel$Run)
.GlobalEnv$.ShinyGR.hist <- .GlobalEnv$.ShinyGR.hist[!(duplicated(sapply(.GlobalEnv$.ShinyGR.hist, function(x) sum(x$Param)), fromLast = TRUE) &
duplicated(sapply(.GlobalEnv$.ShinyGR.hist, function(x) x$TypeModel), fromLast = TRUE))]
.GlobalEnv$.ShinyGR.hist <- tail(.GlobalEnv$.ShinyGR.hist, n = 2)
if (length(.GlobalEnv$.ShinyGR.hist) == 2 & is.null(names(.GlobalEnv$.ShinyGR.hist[[1]]))) {
.GlobalEnv$.ShinyGR.hist[[1]] <- NULL
}
if (length(.GlobalEnv$.ShinyGR.hist) == 2) {
if (.GlobalEnv$.ShinyGR.hist[[1]]$Dataset != .GlobalEnv$.ShinyGR.hist[[2]]$Dataset) { # reset Qold when new dataset
.GlobalEnv$.ShinyGR.hist[[1]] <- NULL
}
}
if (length(.GlobalEnv$.ShinyGR.hist) == 2 & !is.null(names(.GlobalEnv$.ShinyGR.hist[[1]]))) {
isEqualSumQsim <- !identical(sum(.GlobalEnv$.ShinyGR.hist[[1]]$Crit$Value), sum(.GlobalEnv$.ShinyGR.hist[[2]]$Crit$Value))
isEqualTypeModel <- .GlobalEnv$.ShinyGR.hist[[1]]$TypeModel == .GlobalEnv$.ShinyGR.hist[[2]]$TypeModel
isEqualPeriod <- !identical(.GlobalEnv$.ShinyGR.hist[[1]]$Period, .GlobalEnv$.ShinyGR.hist[[2]]$Period)
if (length(.GlobalEnv$.ShinyGR.hist[[1]]$Qsim) != length(.GlobalEnv$.ShinyGR.hist[[2]]$Qsim) |
(isEqualSumQsim & isEqualTypeModel) | isEqualPeriod) {
OBSold <- getPrep()$PREP
281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
OBSold$TypeModel <- .GlobalEnv$.ShinyGR.hist[[1]]$TypeModel
if (.TypeModelGR(OBSold)$CemaNeige & !.TypeModelGR(getPrep()$PREP)$CemaNeige | # present: No CemaNeige ; old: CemaNeige
isEqualSumQsim & isEqualTypeModel) {
if (input$Dataset == "Unnamed watershed") {
ObsDF <- NULL
} else {
# ObsDF <- get(input$Dataset)
ObsDF <- .ShinyGR.args$ObsDF[[input$Dataset]]
}
OBSold <- PrepGR(ObsDF = ObsDF,
DatesR = .ShinyGR.args$DatesR,
Precip = .ShinyGR.args$Precip, PotEvap = .ShinyGR.args$PotEvap,
Qobs = .ShinyGR.args$Qobs, TempMean = .ShinyGR.args$TempMean,
ZInputs = .ShinyGR.args$ZInputs[[input$Dataset]],
HypsoData = .ShinyGR.args$HypsoData[[input$Dataset]],
NLayers = .ShinyGR.args$NLayers[[input$Dataset]],
HydroModel = input$HydroModel,
CemaNeige = input$SnowModel == "CemaNeige")
}
if (input$HydroModel == "GR2M") {
dd <- trunc(input$Period, units = "months")
} else {
dd <- trunc(input$Period, units = "days")
}
SIMold <- SimGR(PrepGR = OBSold,
Param = .GlobalEnv$.ShinyGR.hist[[1]]$Param,
WupPer = substr(getPrep()$WUPPER, 1, 10),
SimPer = substr(c(dd[1], dd[2]), 1, 10),
verbose = FALSE)
if (!getPrep()$isUngauged) {
InputsCritMultiold <- CreateInputsCrit(FUN_CRIT = CRIT_opt$Crit,
InputsModel = OBSold$InputsModel,
RunOptions = SIMold$OptionsSimul,
Obs = replicate(n = nCRIT_opt, expr = SIMold$Qobs, simplify = FALSE),
VarObs = rep("Q", times = nCRIT_opt),
transfo = CRIT_opt$Transfo,
Weights = NULL)
iCRITold <- ErrorCrit(InputsCrit = InputsCritMultiold, OutputsModel = SIMold$OutputsModel, verbose = FALSE)
CRITold <- do.call("rbind", lapply(iCRITold, function(i) data.frame(CritName = i$CritName, CritValue = i$CritValue)))
CRITold <- rbind(CRITold, data.frame(CritName = "BIAS[Qsim/Qobs]",
CritValue = ifelse(is.na(iCRITold[[which(CRITold$CritName == "KGE[Q]")]]$CritValue),
NA,
iCRITold[[which(CRITold$CritName == "KGE[Q]")]]$SubCritValues[3])))
colnames(CRITold) <- c("Criterion", "Value")
} else {
CRITold <- data.frame(Criterion = NA, Value = NA)
}
.GlobalEnv$.ShinyGR.hist[[1]]$Crit <- CRITold
.GlobalEnv$.ShinyGR.hist[[1]]$Qsim <- SIMold$OutputsModel$Qsim
}
}
return(list(PARAM = PARAM, SIM = SIM, SIMold = .GlobalEnv$.ShinyGR.hist, Crit = CRIT))
})
## --------------- Plot
## Choice
getPlotType <- reactive({
switch(input$PlotType,
"Model performance" = 1,
"Flow time series" = 2,
"State variables" = 3,
"Model diagram" = 4)
})
351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
## Models available considering the plot type
# observe({
# if (getPlotType() == 4) {
# updateSelectInput(session, inputId = "HydroModel", choice = c("GR4J", "GR5J", "GR6J"), selected = input$HydroModel)
# updateSelectInput(session, inputId = "SnowModel" , choice = c("None"))
# } else {
# updateSelectInput(session, inputId = "HydroModel", choice = c("GR4J", "GR5J", "GR6J"), selected = input$HydroModel)
# updateSelectInput(session, inputId = "SnowModel" , choice = c("None", "CemaNeige") , selected = input$SnowModel)
# }
# })
## Plots available considering the model type
# observe({
# if (input$HydroModel == "GR6J") {
# updateSelectInput(session, inputId = "PlotType",
# choice = c("Flow time series", "Model performance", "State variables"),
# selected = input$PlotType)
# } else {
# updateSelectInput(session, inputId = "PlotType",
# choice = c("Flow time series", "Model performance", "State variables", "Model diagram"),
# selected = input$PlotType)
# }
# })
# Formated simulation results
getData <- reactive({
OutputsModel <- getSim()$SIM$OutputsModel
IndPlot <- which(OutputsModel$DatesR >= input$Period[1L] & OutputsModel$DatesR <= input$Period[2L])
OutputsModel2 <- sapply(OutputsModel[seq_len(which(names(OutputsModel) == "Qsim"))], function(x) x[IndPlot])
OutputsModel2 <- c(OutputsModel2, Qobs = list(getSim()$SIM$Qobs[IndPlot]))
if (length(OutputsModel2$DatesR) != 0) {
data <- data.frame(DatesR = OutputsModel2$DatesR,
precip. = OutputsModel2$Precip,
PET = OutputsModel2$PotEvap,
prod. = OutputsModel2$Prod,
# rout. = OutputsModel2$Rout,
# exp. = rep(NA, length(OutputsModel2$DatesR)),
# 'exp. (+)'= rep(NA, length(OutputsModel2$DatesR)),
# 'exp. (-)'= rep(NA, length(OutputsModel2$DatesR)),
# Qr = OutputsModel2$QR,
# Qd = OutputsModel2$QD,
Qsim = OutputsModel2$Qsim,
Qobs = OutputsModel2$Qobs,
QsimOld = rep(NA, length(OutputsModel2$DatesR)))
# QrExp = rep(NA, length(OutputsModel2$DatesR)))
if (length(.GlobalEnv$.ShinyGR.hist) == 2 & input$ShowOldQsim == "Yes") {
data$QsimOld <- .GlobalEnv$.ShinyGR.hist[[1]]$Qsim[seq_len(nrow(data))]
}
if (input$HydroModel == "GR6J") {
data$'exp.' <- NULL
data$'exp. (+)'<- ifelse(OutputsModel2$Exp >= 0, OutputsModel2$Exp, NA)
data$'exp. (-)'<- ifelse(OutputsModel2$Exp < 0, OutputsModel2$Exp, NA)
data$QrExp <- OutputsModel2$QRExp
}
if (input$HydroModel != "GR2M") {
data$'rout.' = OutputsModel2$Rout
data$'Qr' = OutputsModel2$QR
data$'Qd' = OutputsModel2$QD
} else {
data$'rout.' = NA
data$'Qr' = NA
data$'Qd' = NA
}
return(list(OutputsModel = OutputsModel2, Tab = data))
}
})
421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
## Period slider responds to changes in the selected/zoomed dateWindow
observeEvent({input$dyPlotTSq_date_window ; input$dyPlotSVq_date_window ; input$dyPlotMDp_date_window}, {
if (!is.null(input$dyPlotTSq_date_window) && getPlotType() == 2) {
dateWindow <- as.POSIXct(strftime(input$dyPlotTSq_date_window , "%Y-%m-%d %H:%M:%S"), tz = "UTC")
}
if (!is.null(input$dyPlotSVq_date_window) && getPlotType() == 3) {
dateWindow <- as.POSIXct(strftime(input$dyPlotSVq_date_window, "%Y-%m-%d %H:%M:%S"), tz = "UTC")
}
if (!is.null(input$dyPlotMDp_date_window) && getPlotType() == 4) {
dateWindow <- as.POSIXct(strftime(input$dyPlotMDp_date_window, "%Y-%m-%d %H:%M:%S"), tz = "UTC")
}
if (exists("dateWindow")) {
# if (dateWindow[1L] == dateWindow[2L]) {
# if (dateWindow[1L] == as.POSIXct(.ShinyGR.args$SimPer[2L], tz = "UTC")) {
# updateSliderInput(session, inputId = "Period",
# value = dateWindow - c(1, 0) * .TypeModelGR(input$HydroModel)$TimeLag)
# } else {
# updateSliderInput(session, inputId = "Period",
# value = dateWindow + c(0, 1) * .TypeModelGR(input$HydroModel)$TimeLag)
# }
# } else {
if (dateWindow[1L] != dateWindow[2L]) {
timeFormat <- ifelse(input$HydroModel == "GR2M", "%Y-%m", "%F")
updateSliderInput(session, inputId = "Period",
value = dateWindow, ### + .TypeModelGR(input$HydroModel)$TimeLag,
timeFormat = timeFormat, timezone = "+0000")
}
# }
}
}, priority = +100)
# observe({
# if (getPlotType() == 1) {
# if (input$Period[1L] == input$Period[2L]) {
# if (input$Period[1L] == as.POSIXct(.ShinyGR.args$SimPer[2L], tz = "UTC")) {
# updateSliderInput(session, inputId = "Period",
# value = input$Period - c(1, 0) * .TypeModelGR(input$HydroModel)$TimeLag)
# } else {
# updateSliderInput(session, inputId = "Period",
# value = input$Period + c(0, 1) * .TypeModelGR(input$HydroModel)$TimeLag)
# }
# }
# }
# }, priority = +100)
## Disable all inputs if there is no data
observe({
if (input$Period[1L] == input$Period[2L]) {
inputs <- gsub("Period", "CalButton", getInputs())
lapply(inputs, shinyjs::disable)
}
}, priority = -100)
## Reset period slider responds to dygraphs to mouse clicks
observeEvent({input$dyPlotTSq_click}, {
timeFormat <- ifelse(input$HydroModel == "GR2M", "%Y-%m", "%F")
updateSliderInput(session, inputId = "Period",
value = as.POSIXct(.ShinyGR.args$SimPer[[input$Dataset]], tz = "UTC"),
timeFormat = timeFormat, timezone = "+0000")
}, priority = +10)
observeEvent({input$dyPlotTSe_click}, {
timeFormat <- ifelse(input$HydroModel == "GR2M", "%Y-%m", "%F")
updateSliderInput(session, inputId = "Period",
value = as.POSIXct(.ShinyGR.args$SimPer[[input$Dataset]], tz = "UTC"),
timeFormat = timeFormat, timezone = "+0000")
}, priority = +10)
491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560
observeEvent({input$dyPlotSVs_click}, {
timeFormat <- ifelse(input$HydroModel == "GR2M", "%Y-%m", "%F")
updateSliderInput(session, inputId = "Period",
value = as.POSIXct(.ShinyGR.args$SimPer[[input$Dataset]], tz = "UTC"),
timeFormat = timeFormat, timezone = "+0000")
}, priority = +10)
observeEvent({input$dyPlotSVq_click}, {
timeFormat <- ifelse(input$HydroModel == "GR2M", "%Y-%m", "%F")
updateSliderInput(session, inputId = "Period",
value = as.POSIXct(.ShinyGR.args$SimPer[[input$Dataset]], tz = "UTC"),
timeFormat = timeFormat, timezone = "+0000")
}, priority = +10)
observeEvent({input$dyPlotMDp_click}, {
timeFormat <- ifelse(input$HydroModel == "GR2M", "%Y-%m", "%F")
updateSliderInput(session, inputId = "Period",
value = as.POSIXct(.ShinyGR.args$SimPer[[input$Dataset]], tz = "UTC"),
timeFormat = timeFormat, timezone = "+0000")
}, priority = +10)
observeEvent({input$dyPlotMDe_click}, {
timeFormat <- ifelse(input$HydroModel == "GR2M", "%Y-%m", "%F")
updateSliderInput(session, inputId = "Period",
value = as.POSIXct(.ShinyGR.args$SimPer[[input$Dataset]], tz = "UTC"),
timeFormat = timeFormat, timezone = "+0000")
}, priority = +10)
observeEvent({input$dyPlotMDq_click}, {
timeFormat <- ifelse(input$HydroModel == "GR2M", "%Y-%m", "%F")
updateSliderInput(session, inputId = "Period",
value = as.POSIXct(.ShinyGR.args$SimPer[[input$Dataset]], tz = "UTC"),
timeFormat = timeFormat, timezone = "+0000")
}, priority = +10)
## Time window slider and dataset choosen on the Summary sheet panel
observeEvent({input$Dataset}, {
timeFormat <- ifelse(input$HydroModel == "GR2M", "%Y-%m", "%F")
updateSliderInput(session, inputId = "Period",
min = as.POSIXct(.ShinyGR.args$SimPer[[input$Dataset]][1L], tz = "UTC"),
max = as.POSIXct(.ShinyGR.args$SimPer[[input$Dataset]][2L], tz = "UTC"),
value = as.POSIXct(.ShinyGR.args$SimPer[[input$Dataset]], tz = "UTC"),
timeFormat = timeFormat, timezone = "+0000")
updateSelectInput(session, inputId = "DatasetSheet",
choices = .ShinyGR.args$NamesObsBV,
selected = input$Dataset)
})
## Dataset choosen on the SInterface panel
observeEvent({input$DatasetSheet}, {
updateSelectInput(session, inputId = "Dataset",
choices = .ShinyGR.args$NamesObsBV,
selected = input$DatasetSheet)
})
## Target date slider
eventReactive({input$Dataset}, {
updateSliderInput(session, inputId = "Event", label = "Select the target date:",
min = as.POSIXct(.ShinyGR.args$SimPer[[input$Dataset]][1L], tz = "UTC"),## + .TypeModelGR(input$HydroModel)$TimeLag,
max = as.POSIXct(.ShinyGR.args$SimPer[[input$Dataset]][2L], tz = "UTC"),
value = as.POSIXct(.ShinyGR.args$SimPer[[input$Dataset]][1L], tz = "UTC"), + .TypeModelGR(input$HydroModel)$TimeLag,
timeFormat = "%F", timezone = "+0000")
})
observe({
updateSliderInput(session, inputId = "Event", label = "Select the target date:",
min = input$Period[1L],## + .TypeModelGR(input$HydroModel)$TimeLag,
max = input$Period[2L],
timeFormat = "%F", timezone = "+0000")
})
561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630
## Graphical parameters
getPlotPar <- reactive({
if (.GlobalEnv$.ShinyGR.args$theme == "Cyborg") {
col_bg <- "black"
col_fg <- "white"
par(bg = col_bg, fg = col_fg, col.axis = col_fg, col.lab = col_fg)
} else if (.GlobalEnv$.ShinyGR.args$theme == "Flatly") {
col_bg <- "#2C3E50"
col_fg <- "black"
par(bg = col_bg, fg = col_fg, col.axis = col_bg, col.lab = col_bg)
} else {
col_bg <- "white"
col_fg <- "black"
par(bg = col_bg , fg = col_fg)
}
return(list(col_bg = col_bg, col_fg = col_fg, par = par(no.readonly = TRUE)))
})
## Plot model performance
output$stPlotMP <- renderPlot({
if (length(getSim()$SIM$OutputsModel$DatesR) < 2) {
return(NULL)
}
OutputsModel <- getSim()$SIM$OutputsModel
IndPlot <- which(OutputsModel$DatesR >= input$Period[1L] & OutputsModel$DatesR <= input$Period[2L])
par(getPlotPar()$par)
par(cex.axis = 1.2)
if (input$SnowModel != "CemaNeige") {
par(oma = c(20, 0, 0, 0))
}
plot(OutputsModel, Qobs = getSim()$SIM$Qobs, IndPeriod_Plot = IndPlot, cex.lab = 1.2, cex.axis = 1.4, cex.leg = 1.4)
}, bg = "transparent")
## Plot flow time series
output$dyPlotTSq <- dygraphs::renderDygraph({
if (length(getSim()$SIM$OutputsModel$DatesR) < 2) {
return(NULL)
}
if (length(getSim()$SIMold) == 2 & input$ShowOldQsim == "Yes") {
QsimOld <- getSim()$SIMold[[1]]$Qsim
} else {
QsimOld <- NULL
}
op <- getPlotPar()$par
dgTSq <- dyplot(getSim()$SIM, Qsup = QsimOld, Qsup.name = "Qold",
RangeSelector = FALSE, LegendShow = "auto",
col.Q = c(op$fg, "orangered", "grey"),
col.Precip = c("#428BCA", "lightblue"),
col.na = rgb(0.5, 0.5, 0.5, alpha = 0.4),
group = "ts")
dgTSq <- dygraphs::dyOptions(dgTSq, axisLineColor = op$fg, axisLabelColor = op$fg,
retainDateWindow = FALSE, useDataTimezone = TRUE)
dgTSq <- dygraphs::dyLegend(dgTSq, show = "follow", width = 325)
dgTSq <- dygraphs::dyCrosshair(dgTSq, direction = "vertical")
})
output$dyPlotTSe <- dygraphs::renderDygraph({
if (length(getSim()$SIM$OutputsModel$DatesR) < 2) {
return(NULL)
}
if (getPrep()$isUngauged) {
return(NULL)
}
if (length(getSim()$SIMold) == 2 & input$ShowOldQsim == "Yes") {
ErrorOld <- getSim()$SIMold[[1]]$Qsim - getSim()$SIM$Qobs
} else {
ErrorOld <- NA
}
data <- data.frame(DatesR = getSim()$SIM$OutputsModel$DatesR,
631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700
Error = getSim()$SIM$OutputsModel$Qsim - getSim()$SIM$Qobs,
ErrorOld = ErrorOld,
naCol = NA)
data.xts <- xts::xts(data[, -1L, drop = FALSE], order.by = data$DatesR, tz = "UTC")
op <- getPlotPar()$par
dgTSe <- dygraphs::dygraph(data.xts, group = "ts", ylab = "flow error [mm/d]", main = " ")
dgTSe <- dygraphs::dySeries(dgTSe, "Error" , axis = "y" , color = "orangered")
dgTSe <- dygraphs::dySeries(dgTSe, "ErrorOld", axis = "y" , color = "grey", strokePattern = "dashed")
dgTSe <- dygraphs::dySeries(dgTSe, "naCol", axis = "y2", color = NA)
dgTSe <- dygraphs::dyAxis(dgTSe, name = "y", axisLabelWidth = 60)
dgTSe <- dygraphs::dyAxis(dgTSe, name = "y2", drawGrid = FALSE,
axisLabelFormatter = "function(d) {return d.toString().replace(/./g,'');}",
axisLabelWidth = 60)
dgTSe <- dygraphs::dyOptions(dgTSe, titleHeight = 50,
axisLineColor = op$fg, axisLabelColor = op$fg,
retainDateWindow = FALSE, useDataTimezone = TRUE)
dgTSe <- dygraphs::dyLegend(dgTSe, show = "onmouseover", width = 225)
dgTSe <- dygraphs::dyCrosshair(dgTSe, direction = "vertical")
dgTSe <- dygraphs::dyLimit(dgTSe, limit = 0, color = "blue")
idNA <- .StartStop(data$Error, FUN = is.na)
dgTSe <- .DyShadingMulti(dygraph = dgTSe, color = rgb(0.5, 0.5, 0.5, alpha = 0.4),
ts = data$DatesR, idStart = idNA$start, IdStop = idNA$stop)
})
## Plot state variables stores
output$dyPlotSVs <- dygraphs::renderDygraph({
if (length(getSim()$SIM$OutputsModel$DatesR) < 2) {
return(NULL)
}
# OutputsModel <- getSim()$SIM$OutputsModel
# data <- data.frame(DatesR = OutputsModel$DatesR,
# prod. = OutputsModel$Prod,
# rout. = OutputsModel$Rout)
data <- getData()$Tab[, c("DatesR", "prod.", "rout.", grep("^exp", colnames(getData()$Tab), value = TRUE))]
data.xts <- xts::xts(data[, -1L], order.by = data$DatesR, tzone = "UTC")
if (input$HydroModel == "GR6J") {
colors = c("#00008B", "#008B8B", "#10B510", "#FF0303")
} else {
colors = c("#00008B", "#008B8B")
}
op <- getPlotPar()$par
dgSVs <- dygraphs::dygraph(data.xts, group = "state_var", ylab = "store [mm]")
dgSVs <- dygraphs::dyOptions(dgSVs, colors = colors,
fillGraph = TRUE, fillAlpha = 0.3,
drawXAxis = FALSE, axisLineColor = op$fg, axisLabelColor = op$fg,
retainDateWindow = FALSE, useDataTimezone = TRUE)
dgSVs <- dygraphs::dyLegend(dgSVs, show = "always", width = 325)
dgSVs <- dygraphs::dyCrosshair(dgSVs, direction = "vertical")
})
## Plot state variables Q
output$dyPlotSVq <- dygraphs::renderDygraph({
if (length(getSim()$SIM$OutputsModel$DatesR) < 2) {
return(NULL)
}
# OutputsModel <- getSim()$SIM$OutputsModel
# IndPlot <- which(OutputsModel$DatesR >= input$Period[1L] & OutputsModel$DatesR <= input$Period[2L])
# OutputsModel2 <- sapply(OutputsModel[seq_len(which(names(OutputsModel) == "Qsim"))], function(x) x[IndPlot])
# OutputsModel2 <- c(OutputsModel2, Qobs = list(getSim()$SIM$Qobs[IndPlot]))
#
# data <- data.frame(DatesR = OutputsModel2$DatesR,
# Qr = OutputsModel2$QR,
# Qd = OutputsModel2$QD,
# Qsim = OutputsModel2$Qsim,
# Qobs = OutputsModel2$Qobs)
# if (input$HydroModel == "GR6J") {
701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770
# data$QrExp <- OutputsModel2$QRExp
# } else {
# data$QrExp <- NA
# }
colSelec <- c("DatesR", "Qr", "Qd", grep("^QrExp", colnames(getData()$Tab), value = TRUE), "Qsim", "Qobs")
if (length(getSim()$SIMold) == 2 & input$ShowOldQsim == "Yes") {
colSelec <- c(colSelec, "QsimOld")
}
data <- getData()$Tab[, colSelec]
data.xts <- xts::xts(data[, -1L], order.by = data$DatesR, tzone = "UTC")
if (input$HydroModel == "GR6J") {
names <- c("Qd", "Qr", "QrExp")
colors <- c("#FFD700", "#EE6300", "brown")
} else {
names <- c("Qd", "Qr")
colors <- c("#FFD700", "#EE6300")
}
op <- getPlotPar()$par
dgSVq <- dygraphs::dygraph(data.xts, group = "state_var", ylab = paste0("flow [mm/", getPrep()$TMGR$TimeUnit, "]"), main = " ")
dgSVq <- dygraphs::dyOptions(dgSVq, fillAlpha = 1.0,
axisLineColor = op$fg, axisLabelColor = op$fg, titleHeight = 10,
retainDateWindow = FALSE, useDataTimezone = TRUE)
dgSVq <- dygraphs::dyStackedRibbonGroup(dgSVq, name = names,
color = colors, strokeBorderColor = "black")
dgSVq <- dygraphs::dySeries(dgSVq, name = "Qobs", fillGraph = FALSE, drawPoints = TRUE, color = op$fg)
dgSVq <- dygraphs::dySeries(dgSVq, name = "Qsim", fillGraph = FALSE, color = "orangered")
if (length(getSim()$SIMold) == 2 & input$ShowOldQsim == "Yes") {
dgSVq <- dygraphs::dySeries(dgSVq, name = "QsimOld", label = "Qold", fillGraph = FALSE, color = "grey", strokePattern = "dashed")
}
dgSVq <- dygraphs::dyCrosshair(dgSVq, direction = "vertical")
dgSVq <- dygraphs::dyLegend(dgSVq, show = "always", width = 325)
idNA <- .StartStop(getData()$Tab$Qobs, FUN = is.na)
dgSVq <- .DyShadingMulti(dygraph = dgSVq, color = rgb(0.5, 0.5, 0.5, alpha = 0.4),
ts = data$DatesR, idStart = idNA$start, IdStop = idNA$stop)
})
## Plot model diagram precipitation
output$dyPlotMDp <- dygraphs::renderDygraph({
if (length(getSim()$SIM$OutputsModel$DatesR) < 2) {
return(NULL)
}
data <- data.frame(DatesR = getSim()$SIM$OutputsModel$DatesR)
if (grepl("CemaNeige", getSim()$SIM$TypeModel)) {
data$Psol <- rowMeans(sapply(getSim()$SIM$OutputsModel$CemaNeigeLayers, function(x) x$Psol))
data$Pliq <- rowMeans(sapply(getSim()$SIM$OutputsModel$CemaNeigeLayers, function(x) x$Pliq))
Plim <- c(-1e-3, max(data$Psol+data$Pliq, na.rm = TRUE))
col.Precip = c("#428BCA", "lightblue")
} else {
data$Precip <- getSim()$SIM$OutputsModel$Precip
Plim <- c(-1e-3, max(data$Precip, na.rm = TRUE))
col.Precip <- c("#428BCA")
}
data.xts <- xts::xts(data[, -1L, drop = FALSE], order.by = data$DatesR, tzone = "UTC")
dateEvent <- trunc(input$Event, units = ifelse(input$HydroModel == "GR2M", "months", "days"))
dgMDp <- dygraphs::dygraph(data.xts, group = "mod_diag", ylab = paste0("precip. [mm/", getPrep()$TMGR$TimeUnit, "]"))
dgMDp <- dygraphs::dyOptions(dgMDp, colors = col.Precip, drawXAxis = FALSE,
retainDateWindow = FALSE, useDataTimezone = TRUE)
dgMDp <- dygraphs::dyStackedBarGroup(dgMDp, name = rev(grep("^P", colnames(data.xts), value = TRUE)),
axis = "y", color = (col.Precip))
dgMDp <- dygraphs::dyAxis(dgMDp, name = "y", valueRange = rev(Plim))
dgMDp <- dygraphs::dyEvent(dgMDp, dateEvent, color = "orangered")
dgMDp <- dygraphs::dyLegend(dgMDp, show = "onmouseover", width = 225)
dgMDp <- dygraphs::dyCrosshair(dgMDp, direction = "vertical")
771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840
})
## Plot model diagram ETP
output$dyPlotMDe <- dygraphs::renderDygraph({
if (length(getSim()$SIM$OutputsModel$DatesR) < 2) {
return(NULL)
}
# data <- data.frame(DatesR = getSim()$SIM$OutputsModel$DatesR,
# PET = getSim()$SIM$OutputsModel$PotEvap)
data <- getData()$Tab[, c("DatesR", "PET")]
data.xts <- xts::xts(data[, -1L, drop = FALSE], order.by = data$DatesR, tzone = "UTC")
dateEvent <- trunc(input$Event, units = ifelse(input$HydroModel == "GR2M", "months", "days"))
op <- getPlotPar()$par
dgMDe <- dygraphs::dygraph(data.xts, group = "mod_diag", ylab = paste0("PET [mm/", getPrep()$TMGR$TimeUnit, "]"), main = " ")
dgMDe <- dygraphs::dyOptions(dgMDe, colors = "#A4C400", drawPoints = TRUE,
strokeWidth = 0, pointSize = 2, drawXAxis = FALSE,
axisLineColor = op$fg, axisLabelColor = op$fg, titleHeight = 10,
retainDateWindow = FALSE, useDataTimezone = TRUE)
dgMDe <- dygraphs::dyEvent(dgMDe, dateEvent, color = "orangered")
dgMDe <- dygraphs::dyLegend(dgMDe, show = "onmouseover", width = 225)
dgMDe <- dygraphs::dyCrosshair(dgMDe, direction = "vertical")
})
## Plot model diagram flow
output$dyPlotMDq <- dygraphs::renderDygraph({
if (length(getSim()$SIM$OutputsModel$DatesR) < 2) {
return(NULL)
}
# if (length(getSim()$SIMold) == 2 & input$ShowOldQsim == "Yes") {
# QsimOld <- getSim()$SIMold[[1]]$Qsim
# } else {
# QsimOld <- NA
# }
# OutputsModel <- getSim()$SIM$OutputsModel
# IndPlot <- which(OutputsModel$DatesR >= input$Period[1L] & OutputsModel$DatesR <= input$Period[2L])
# OutputsModel2 <- sapply(OutputsModel[seq_len(which(names(OutputsModel) == "Qsim"))], function(x) x[IndPlot])
# OutputsModel2 <- c(OutputsModel2, Qobs = list(getSim()$SIM$Qobs[IndPlot]))
# OutputsModel2$Qsim <- ifelse(format(OutputsModel2$DatesR, "%Y%m%d") > format(input$Event, "%Y%m%d"), NA, OutputsModel2$Qsim)
# OutputsModel2$Qold <- ifelse(format(OutputsModel2$DatesR, "%Y%m%d") > format(input$Event, "%Y%m%d"), NA, QsimOld[IndPlot])
#
# data <- data.frame(DatesR = OutputsModel2$DatesR,
# Qobs = OutputsModel2$Qobs,
# Qsim = OutputsModel2$Qsim,
# QsimOld = OutputsModel2$Qold)
data <- getData()$Tab[, c("DatesR", "Qobs", "Qsim", "QsimOld")]
data$Qsim <- ifelse(format(data$DatesR, "%Y%m%d") > format(input$Event, "%Y%m%d"), NA, data$Qsim)
data$QsimOld <- ifelse(format(data$DatesR, "%Y%m%d") > format(input$Event, "%Y%m%d"), NA, data$QsimOld)
data.xts <- xts::xts(data[, -1L, drop = FALSE], order.by = data$DatesR, tzone = "UTC")
dateEvent <- trunc(input$Event, units = ifelse(input$HydroModel == "GR2M", "months", "days"))
op <- getPlotPar()$par
dgMDq <- dygraphs::dygraph(data.xts, group = "mod_diag", ylab = paste0("flow [mm/", getPrep()$TMGR$TimeUnit, "]"), main = " ")
dgMDq <- dygraphs::dyOptions(dgMDq, colors = c(op$fg, "orangered", "grey"), drawPoints = TRUE,
axisLineColor = op$fg, axisLabelColor = op$fg, titleHeight = 10,
retainDateWindow = FALSE, useDataTimezone = TRUE)
dgMDq <- dygraphs::dySeries(dgMDq, name = "Qsim" , drawPoints = FALSE)
dgMDq <- dygraphs::dyEvent(dgMDq, dateEvent, color = "orangered")
dgMDq <- dygraphs::dySeries(dgMDq, name = "QsimOld", label = "Qold", drawPoints = FALSE, strokePattern = "dashed")
dgMDq <- dygraphs::dyLegend(dgMDq, show = "onmouseover", width = 225)
dgMDq <- dygraphs::dyCrosshair(dgMDq, direction = "vertical")
idNA <- .StartStop(data$Qobs, FUN = is.na)
dgMDq <- .DyShadingMulti(dygraph = dgMDq, color = rgb(0.5, 0.5, 0.5, alpha = 0.4),
ts = data$DatesR, idStart = idNA$start, IdStop = idNA$stop)
})
## Plot model diagram chart
841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910
output$stPlotMD <- renderPlot({
if (length(getSim()$SIM$OutputsModel$DatesR) < 2) {
return(NULL)
}
# OutputsModel <- getSim()$SIM$OutputsModel
# IndPlot <- which(OutputsModel$DatesR >= input$Period[1L] & OutputsModel$DatesR <= input$Period[2L])
# OutputsModel2 <- sapply(OutputsModel[seq_len(which(names(OutputsModel) == "Qsim"))], function(x) x[IndPlot])
# OutputsModel2 <- c(OutputsModel2, Qobs = list(getSim()$SIM$Qobs[IndPlot]))
# OutputsModel2 <- getData()$OutputsModel
par(getPlotPar()$par)
try(.DiagramGR(OutputsModel = getData()$OutputsModel, Param = getSim()$PARAM,
SimPer = input$Period, EventDate = input$Event,
HydroModel = input$HydroModel, CemaNeige = input$SnowModel == "CemaNeige"),
silent = TRUE)
}, bg = "transparent")
## --------------- Criteria table
output$Criteria <- renderTable({
## Table created in order to choose order the criteria in the table output
tabCrit_gauge <- data.frame(Criterion = c("NSE[Q]", "NSE[sqrt(Q)]", "NSE[1/Q]",
"KGE[Q]", "KGE[sqrt(Q)]", "KGE[1/Q]",
"BIAS[Qsim/Qobs]"),
ID = 1:7, stringsAsFactors = FALSE)
if (length(getSim()$SIMold) == 2 & input$ShowOldQsim == "Yes") {
tabCrit_old <- getSim()$SIMold[[1]]$Crit$Value
tabCrit_val <- cbind(getSim()$Crit, tabCrit_old)
colnames(tabCrit_val) <- c(colnames(getSim()$Crit), "Qold")
CellColHisto <- '<div style="color: #808080;"><span>9999</span></div>'
} else {
tabCrit_val <- getSim()$Crit
}
tabCrit_out <- merge(tabCrit_gauge, tabCrit_val, by = "Criterion", all.x = TRUE)
tabCrit_out <- tabCrit_out[order(tabCrit_out$ID), ]
tabCrit_out <- tabCrit_out[, !colnames(tabCrit_out) %in% "ID"]
tabCrit_out[tabCrit_out <= -99.99] <- -99.99
tabCrit_out[, seq_len(ncol(tabCrit_out))[-1]] <- sapply(seq_len(ncol(tabCrit_out))[-1], function(x) sprintf("%7.2f", tabCrit_out[, x]))
tabCrit_out <- as.data.frame(tabCrit_out)
tabCrit_out[tabCrit_out == " -99.99"] <- "< -99.99"
colnames(tabCrit_out) <- gsub("Value", "Qsim", colnames(tabCrit_out))
tabCrit_out$Criterion <- gsub("\\[", " [", tabCrit_out$Criterion)
## Color the cell of the crietaia uses during the calibration
if (CAL_click$valueButton >= 0) {
CellColCalib <- '<div style="color: #FFFFFF; background-color: #A4C400; border: 5px solid #A4C400; position:relative; top: 0px; left: 5px; padding: 0px; margin: -5px -0px -8px -10px;">
<span>9999</span></div>'
CellColCalib_id <- which(tabCrit_out$Criterion == input$TypeCrit)
tabCrit_out[CellColCalib_id, 2] <- gsub("9999", tabCrit_out[CellColCalib_id, 2], CellColCalib)
}
if (input$ShowOldQsim == "Yes" & length(getSim()$SIMold) > 1) {
tabCrit_out[, "Qold"] <- apply(tabCrit_out[, "Qold", drop = FALSE], 1, function(x) gsub("9999", x, CellColHisto))
}
return(tabCrit_out)
}, align = c("r"), sanitize.text.function = function(x) x)
## --------------- Download buttons
## Download simulation table
output$DownloadTab <- downloadHandler(
911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980
filename = function() {
filename <- "TabSim"
filename <- sprintf("airGR_%s_%s.csv", filename, gsub("(.*)( )(\\d{2})(:)(\\d{2})(:)(\\d{2})", "\\1_\\3h\\5m\\7s", Sys.time()))
},
content = function(file) {
TabSim <- as.data.frame(getSim()$SIM)
if (getPrep()$isUngauged) {
TabSim$Qobs <- NA
}
colnames(TabSim) <- sprintf("%s [%s]", colnames(TabSim), c("-", rep("mm", 2), "-", "°C", rep("mm", 2)))
colnames(TabSim) <- ifelse(grepl("mm", colnames(TabSim)),
gsub("mm", paste0("mm/", .TypeModelGR(getSim()$SIM)$TimeUnit), colnames(TabSim)),
colnames(TabSim))
write.table(TabSim, file = file, row.names = FALSE, sep = ";")
}
)
## Download plots
output$DownloadPlot <- downloadHandler(
filename = function() {
filename <- switch(input$PlotType,
"Model performance" = "PlotModelPerf",
"Flow time series" = "PlotFlowTimeSeries",
"State variables" = "PlotStateVar",
"Model diagram" = "PlotModelDiag")
filename <- sprintf("airGR_%s_%s.png", filename, gsub("(.*)( )(\\d{2})(:)(\\d{2})(:)(\\d{2})", "\\1_\\3h\\5m\\7s", Sys.time()))
},
content = function(file) {
k <- 1.75
ParamTitle <- c("X1", "X2" , "X3", "X4", "X5", "X6")[seq_len(getPrep()$TMGR$NbParam)]
ParamUnits <- c("mm", "mm/%s", "mm", "%s", "", "mm")[seq_len(getPrep()$TMGR$NbParam)]
if (input$SnowModel == "CemaNeige") {
ParamTitle <- c(ParamTitle, "C1", "C2")
ParamUnits <- c(ParamUnits, "", "mm/°C/%s")
}
ParamTitle <- paste(ParamTitle, paste(getSim()$PARAM, sprintf(ParamUnits, getPrep()$TMGR$TimeUnit)), sep = " = ", collapse = ", ")
ParamTitle <- gsub(" ,", ",", ParamTitle)
PngTitle <- sprintf("%s - %s/%s\n%s\n%s", input$Dataset,
input$HydroModel, ifelse(input$SnowModel == "CemaNeige", "CemaNeige", "No snow model"),
paste0(input$Period, collapse = " - "),
ParamTitle)
if (getPlotType() == 1) {
png(filename = file, width = 1000*k, height = ifelse(input$SnowModel != "CemaNeige", 700*k, 1100*k), pointsize = 14, res = 150)
par(oma = c(0, 0, 4, 0))
plot(getSim()$SIM)
mtext(text = PngTitle, side = 3, outer = TRUE, cex = 0.8, line = 1.2)
dev.off()
}
if (getPlotType() == 2) {
png(filename = file, width = 1000*k, height = 600*k, pointsize = 14, res = 150)
par(oma = c(0, 0, 4, 0))
plot(getSim()$SIM, which = c("Precip", "Flows", "Error"))
mtext(text = PngTitle, side = 3, outer = TRUE, cex = 0.8, line = 1.2)
dev.off()
}
if (getPlotType() == 3) {
png(filename = file, width = 1000*k, height = 600*k, pointsize = 14, res = 150)
# OutputsModel <- getSim()$SIM$OutputsModel
# IndPlot <- which(OutputsModel$DatesR >= input$Period[1L] & OutputsModel$DatesR <= input$Period[2L])
# OutputsModel2 <- sapply(OutputsModel[seq_len(which(names(OutputsModel) == "Qsim"))], function(x) x[IndPlot])
# OutputsModel2 <- c(OutputsModel2, Qobs = list(getSim()$SIM$Qobs[IndPlot]))
#
# data <- data.frame(DatesR = OutputsModel2$DatesR,
# prod. = OutputsModel2$Prod,
# rout. = OutputsModel2$Rout,
# Qr = OutputsModel2$QR,
# Qd = OutputsModel2$QD,
# Qsim = OutputsModel2$Qsim,
# Qobs = OutputsModel2$Qobs)
981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050
# if (input$HydroModel == "GR6J") {
# data$QrExp <- OutputsModel2$QRExp
# } else {
# data$QrExp <- 0
# }
data <- getData()$Tab[, c("DatesR", "prod.", "rout.", "Qr", "Qd", grep("^QrExp|exp", colnames(getData()$Tab), value = TRUE), "Qsim", "Qobs")]
par(mfrow = c(2, 1), oma = c(3, 0, 4, 0))
par(mar = c(0.6, 4.0, 0.0, 2.0), xaxt = "n", cex = 0.8)
if (input$HydroModel != "GR6J") {
plot(range(data$Dates), range(data$prod., data$rout.),
type = "n", xlab = "", ylab = "store [mm]")
} else {
data$exp. <- rowSums(data[, c("exp. (+)", "exp. (-)")], na.rm = TRUE)
plot(range(data$Dates), range(data$prod., data$rout., data$rout., data$exp.),
type = "n", xlab = "", ylab = "store [mm]")
}
polygon(c(data$Dates, rev(range(data$Dates))), c(data$prod., rep(0, 2)), border = "darkblue", col = adjustcolor("darkblue", alpha.f = 0.30))
polygon(c(data$Dates, rev(range(data$Dates))), c(data$rout., rep(0, 2)), border = "cyan4" , col = adjustcolor("cyan4" , alpha.f = 0.30))
if (input$HydroModel == "GR6J") {
minQrExp <- min(data$prod., data$rout., data$exp., 0)
colQrExp <- ifelse(minQrExp > 0, "#10B510", "#FF0303")
polygon(c(data$Dates, rev(range(data$Dates))), c(data$exp., rep(0, 2)), border = colQrExp, col = adjustcolor(colQrExp, alpha.f = 0.30))
}
if (input$HydroModel != "GR6J") {
legend("topright", bty = "n", legend = c("prod.", "rout."), cex = 0.8,
pt.bg = adjustcolor(c("darkblue", "cyan4"), alpha.f = 0.30),
col = c("darkblue", "cyan4"),
pch = 22)
} else {
legend("topright", bty = "n", legend = c("prod.", "rout.", "exp. (+)", "exp. (-)"), cex = 0.8,
pt.bg = adjustcolor(c("darkblue", "cyan4", "#10B510", "#FF0303"), alpha.f = 0.30),
col = c("darkblue", "cyan4", "#10B510", "#FF0303"),
pch = 22)
}
par(mar = c(0.0, 4.0, 0.6, 2.0), xaxt = "s")
plot(data$DatesR, data$Qobs, type = "n", xlab = "", ylab = paste0("flow [mm/", getPrep()$TMGR$TimeUnit, "]"))
if (input$HydroModel != "GR6J") {
polygon(c(data$Dates, rev(range(data$Dates))), c(data$Qr+data$Qd, rep(0, 2)), col = "#FFD700", border = NA)
polygon(c(data$Dates, rev(range(data$Dates))), c(data$Qr , rep(0, 2)), col = "#EE6300", border = NA)
legend("topright", bty = "n", legend = c("Qobs", "Qsim", "Qr", "Qd"), cex = 0.8,
col = c(par("fg"), "orangered", "#FFD700", "#EE6300"),
lwd = c(1, 1, NA, NA), pch = c(20, NA, 15, 15))
} else {
polygon(c(data$Dates, rev(range(data$Dates))), c(data$QrExp+data$Qr+data$Qd, rep(0, 2)), col = "#FFD700", border = NA)
polygon(c(data$Dates, rev(range(data$Dates))), c(data$QrExp+data$Qr , rep(0, 2)), col = "#EE6300", border = NA)
polygon(c(data$Dates, rev(range(data$Dates))), c(data$QrExp , rep(0, 2)), col = "brown" , border = NA)
legend("topright", bty = "n", legend = c("Qobs", "Qsim", "Qd", "Qr", "QrExp"), cex = 0.8,
col = c(par("fg"), "orangered", "#FFD700", "#EE6300", "brown"),
lwd = c(1, 1, NA, NA, NA), pch = c(20, NA, 15, 15, 15))
}
lines(data$DatesR, data$Qsim, lwd = 1, col = "orangered")
lines(data$DatesR, data$Qobs, lwd = 1, col = par("fg"), type = "o", pch = 20, cex = 0.5)
mtext(text = PngTitle, side = 3, outer = TRUE, cex = 0.8, line = 0.7)
box()
dev.off()
}
if (getPlotType() == 4) {
isCN <- input$SnowModel == "CemaNeige"
png(filename = file, width = 550*k, height = ifelse(isCN, 1000, 900)*k, pointsize = 12, res = 150)
PngTitleMD <- sprintf("%s - %s/%s\n%s\n%s", input$Dataset,
input$HydroModel, ifelse(input$SnowModel == "CemaNeige", "CemaNeige", "No snow model"),
input$Event,
ParamTitle)
if (grepl("X5", PngTitleMD)) {
PngTitleMD <- gsub(", X5", "\nX5", PngTitleMD)
} else {
PngTitleMD <- gsub(", C1", "\nC1", PngTitleMD)
}
par(oma = c(0, 0, ifelse(isCN, 7, 6), 0))
1051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099
.DiagramGR(OutputsModel = getData()$OutputsModel, Param = getSim()$PARAM,
SimPer = input$Period, EventDate = input$Event,
HydroModel = input$HydroModel, CemaNeige = input$SnowModel == "CemaNeige")
mtext(text = PngTitleMD, side = 3, outer = TRUE, cex = 1.2, line = ifelse(isCN, -0.15, 0.6))
dev.off()
}
}
)
## --------------- Summary sheet
output$Sheet <- renderUI({
codeRegex <- "\\D{1}\\d{7}"
codeBH <- gsub(sprintf("(.*)(%s)(.*)", codeRegex), "\\2", input$DatasetSheet)
urlRegex <- "https://webgr.inrae.fr/wp-content/uploads/fiches/%s_fiche.png"
urlSheet <- sprintf(urlRegex, codeBH)
if (.CheckUrl(urlSheet)) {
tags$p(tags$h6("Click on the image to open it in a new window and to enlarge it."),
tags$a(href = urlSheet, target = "_blank", rel = "noopener noreferrer",
tags$img(src = urlSheet, height = "770px",
alt = "If the image does not appear, click on this link.",
title = "Click to open in a new window")))
} else {
urlSheet <- "fig/sheet_W1110010_thumbnail.png"
urlWebGR <- "https://webgr.inrae.fr"
txtWebGR <- "webgr.inrae.fr"
urlFraDb <- file.path(urlWebGR, "activites/base-de-donnees/")
txtFraDb <- "All the summary sheets are available on"
tags$p(tags$h1("Sorry, the summary sheet is not available for this dataset."),
tags$br(),
tags$h5("Only sheets of stations of the Banque Hydro French database are available."),
tags$h5("To show a summary sheet, the name of the chosen dataset has to contain the Banque Hydro station code (8 characters : 1 letter and 7 numbers)."),
txtFraDb, tags$a(href = urlFraDb, target = "_blank", rel = "noopener noreferrer", txtWebGR), ".",
tags$br(),
tags$br(),
tags$a(href = urlFraDb, target = "_blank", rel = "noopener noreferrer",
tags$img(src = urlSheet, width = "30%", height = "30%",
alt = txtWebGR,
title = paste("Visit", txtWebGR))))
}
})
})