# Define server logic required to draw a scatter plot
server <- function(input, output, session) {
# Render the plot
output$scatterplot <- renderPlot({
# ggplot call
ggplot(dem_data, aes(x = .data[[input$xcol]], y = .data[[input$ycol]])) +
geom_point(aes(color = region)) +
geom_smooth(method = "loess") +
scale_color_viridis_d(option = "plasma") +
theme_minimal() +
labs(
x = names(vars[which(vars == input$xcol)]), # select names in vars that
y = names(vars[which(vars == input$ycol)]), # match input selections
caption = "Source: V-Dem Institute",
color = "Region"
)
})
}
Module 1.5
Scatter Plot App Server
- Read Mastering Shiny, Chapter 3, sections 3.1-3.3
- Read Mastering Shiny, Chapter 12
Overview
In this module we are going to complete our scatter plot app by coding up the server function and calling the app with the shinyApp()
function. The server function is where you are going to put the logic and computations of the application. The server function receives input from the user interface, processes it, and generates the corresponding output. It can perform calculations, query databases, apply statistical models, and produce visualizations.
The Server Function
The server function contains three arguments. Two of them (input
and output
) are mandatory. session
is an optional parameter that controls the behavior of the app during the user session that we won’t get into here. But we will keep it in the function call for now just to remind us that it is there.
Next we are going to define the output of the app with output$scatterplot <- renderPlot({})
. This bit of code is going to render a plot and then save it to the output in an object called scatterplot
. Remember that in the UI, we defined our plot output as plotOutput("scatterplot")
. This is where that object scatterplot
is going to come from. The scatter plot is going to be created in two steps. First we are going to reactively retrieve the data each time the user selects new inputs. To do this we are going to use the inputs (xcol
, ycol
) from the UI to subset our data frame demdata
, e.g. dem_data[, c(input$xcol, input$ycol, "region")]
. That is going to create a three-column data frame with the user’s selected x variable, y variable and the region coding and store it in an object called selectedData
.
From there, we take selectedData
and use it to create a scatter plot with ggplot2
. This is done in the usual way, except for a couple of things. First, in our aes()
call we need to use get()
to specify the x and y variables. aes()
uses nonstandard evaluation to capture variable names, meaning that the bare column names of the data frame are read directly so that you do not have to explicitly quote the inputs. However, in this case the names of the inputs are being passed as a string from the user. The get()
function enables us to retrieve the value of an object based on its name. So our aes()
call will be aes(x = get(x = input$xcol), y = get(input$ycol)).
The other thing we need to do is to add some special code to deal with the x- and y-axis labels because these are going to change every time the user selects a different variable. Here we are going to use the names()
function to return the names of the the object selected in the vars
vector of variable names. To make sure we get the right name from the vector, we are going to use the which()
function. which()
returns the value that satisfies a given function, in this case the index number of the vars
vector that matches the user input. So for example, our x label will be defined as x = names(vars[which(vars == input$xcol)]
. Here the number returned by [which(vars == input$xcol)]
is going to be used to subset the vars
list so that x displays the name of the variable selected by the user.
Displaying your app
At this point it should be relatively simple to view your app. Just add the call to the Shiny app, e.g. shinyApp(ui = ui, server = server)
and click “Run App” in RStudio.
# See above for the definitions of ui and server
ui <- ...
server <- ...
# Run the application
shinyApp(ui = ui, server = server)
Optionally, right now, you can try setting up an account on shinyapps.io. Read over the shinyapps.io user guide and see if you can get it to work. For your final project, you will need to be able to deploy your app but but right now it is fine if you only want to view it locally.