-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.R
More file actions
143 lines (112 loc) · 4.2 KB
/
server.R
File metadata and controls
143 lines (112 loc) · 4.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
library(shiny)
library(ggplot2)
library(reshape)
# Load model into the local environment
source("model.R", local = TRUE)
# Define server logic required to generate the plot
shinyServer(function(input, output, session) {
#Session store is a reactive values ~list
store <- reactiveValues()
store$summaryData <- data.frame()
# Capture input variables in a reactive expression
runArgs <- reactive({
# Bind initial state and parameter inputs
list( state = vapply( names(state)
, function(name) { input[[name]] }
, FUN.VALUE = numeric(1)
)
, parameters = vapply( names(parameters)
, function(name) { input[[name]] }
, FUN.VALUE = numeric(1)
)
)
})
# Run the model in a reactive expression
runModel <- reactive({
args <- runArgs()
# Run the simulation; convert result to a data.frame
data.frame( solver( y = args$state
, times = seq( time["start"]
, input$time.end
, by = abs(input$time.end - time["start"]) / 100
)
, func = model
, parms = args$parameters
)
)
})
observeEvent(input$simStart, {
updateSliderInput( session
, inputId = 'simRun'
, min = input$simStart
, step = (input$simEnd - input$simStart) / simluationSteps
)
})
observeEvent(input$simEnd, {
updateSliderInput( session
, inputId = 'simRun'
, value = input$simEnd
, max = input$simEnd
, step = (input$simEnd - input$simStart) / simluationSteps
)
})
observeEvent(input$simParameter, {
updateNumericInput(session, 'simEnd', value = input[[input$simParameter]])
})
observeEvent(input$simRun, {
updateNumericInput(session, input$simParameter, value = input$simRun)
if(input$tabs == "Simulation") {
# Update with run updates
args <- runArgs()
result <- runModel()
newRow <- nrow(store$summaryData) + 1
# Capture each model initial state
for (state in names(args$state)) {
store$summaryData[newRow, state] <- args$state[[state]]
}
# Capture each model parameter
for (parameter in names(args$parameters)) {
store$summaryData[newRow, parameter] <- args$parameters[[parameter]]
}
# Capture each summary calculation
for (summary in names(state.summary)) {
store$summaryData[newRow, summary] <- state.summary[[summary]](result)
}
store$summaryData[newRow, 'series'] <- input$simSeries
}
})
observeEvent( input$resetSummary, {
store$summaryData <- store$summaryData[nrow(store$summaryData), names(store$summaryData)]
})
# Simulation plot
output$modelPlot <- renderPlot({
ggplot(melt(runModel(), id = "time")) +
geom_line( aes(time, value, colour = variable) ) +
ylab("[variable]") +
ylim(input$ymax[1], input$ymax[2])
})
# Summary plot
output$summaryPlot <- renderPlot({
if (nrow(store$summaryData) > 0) {
ggplot( data.frame( x = store$summaryData[[input$simParameter]]
, y = store$summaryData[[input$simPlot]]
, series = store$summaryData$series
)
, aes(x, y)
) +
geom_point() +
geom_line(aes(color = series)) +
xlab(input$simParameter) +
ylab(input$simPlot)
}
})
# Summary download link
output$downloadSummaryData <- downloadHandler(
filename = function() {
paste('data-', Sys.Date(), '.csv', sep='')
}
, content = function(con) {
write.csv(store$summaryData, con)
}
)
})