I'm a Shiny novice, but I'm trying to use it in a project that I'm working on. I'd like to be able to do two things from clicking on a point on a ggplot graph: add a plot character at the specified point (conditioned on info from the sidebar), and add the coordinates (with info from the sidebar) to a data frame. Here's what I've got in terms of code so far:
library(shiny)
library(ggplot2)
df = data.frame()
ui = pageWithSidebar(
headerPanel("Test"),
sidebarPanel(
radioButtons("orientation", "Pick", c("L", "P", "H")),
selectInput(
"select1",
"Select Here:",
c("Option 1", "Option 2")
),
selectInput(
"select2",
"Select Here:",
c("Option 3", "Option 4"),
),
radioButtons("type", "Type:", c("P", "S")),
radioButtons("creator", "Creator?", c("H", "A"))
),
mainPanel(
plotOutput("plot1", click = "plot_click"),
verbatimTextOutput("info"),
actionButton("update", "Add Event")
)
)
server = function(input, output){
output$plot1 = renderPlot({
ggplot(df) + geom_rect(xmin = 0, xmax = 100, ymin = 0, ymax = 50, fill = "red")
})
output$info = renderText({
paste0("x = ", input$plot_click$x, "\ny = ", input$plot_click$y)
})
}
shinyApp(ui, server)
I'm confused on how to add the clicked x and y points from plot_click to df so that I can add the data to a bigger database. Any help would be appreciated, and I'd be happy to give more info about the project if needed!
Here's a general framework that you could use:
reactiveValues() to set up a reactive data.frame with columns for x, y, inputs
input
observeEvent
actionButton to remove the last added pointA simplified example based on your code is below. The table is based on this answer.

library(shiny)
library(ggplot2)
ui <- pageWithSidebar(
headerPanel("Example"),
sidebarPanel(
radioButtons("color", "Pick Color", c("Pink", "Green", "Blue")),
selectInput("shape", "Select Shape:", c("Circle", "Triangle"))
),
mainPanel(
fluidRow(column(width = 6,
h4("Click plot to add points"),
actionButton("rem_point", "Remove Last Point"),
plotOutput("plot1", click = "plot_click")),
column(width = 6,
h4("Table of points on plot"),
tableOutput("table")))
)
)
server = function(input, output){
## 1. set up reactive dataframe ##
values <- reactiveValues()
values$DT <- data.frame(x = numeric(),
y = numeric(),
color = factor(),
shape = factor())
## 2. Create a plot ##
output$plot1 = renderPlot({
ggplot(values$DT, aes(x = x, y = y)) +
geom_point(aes(color = color,
shape = shape), size = 5) +
lims(x = c(0, 100), y = c(0, 100)) +
theme(legend.position = "bottom") +
# include so that colors don't change as more color/shape chosen
scale_color_discrete(drop = FALSE) +
scale_shape_discrete(drop = FALSE)
})
## 3. add new row to reactive dataframe upon clicking plot ##
observeEvent(input$plot_click, {
# each input is a factor so levels are consistent for plotting characteristics
add_row <- data.frame(x = input$plot_click$x,
y = input$plot_click$y,
color = factor(input$color, levels = c("Pink", "Green", "Blue")),
shape = factor(input$shape, levels = c("Circle", "Triangle")))
# add row to the data.frame
values$DT <- rbind(values$DT, add_row)
})
## 4. remove row on actionButton click ##
observeEvent(input$rem_point, {
rem_row <- values$DT[-nrow(values$DT), ]
values$DT <- rem_row
})
## 5. render a table of the growing dataframe ##
output$table <- renderTable({
values$DT
})
}
shinyApp(ui, server)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With