Я пытаюсь получить оверлей из некоторых точек, представленных ggplot, в блестящем приложении с полигоном, основанным на кликах пользователей. Таким образом, пользователь может выбрать подгруппы из данных xy для дальнейшего анализа.
при интерактивном нажатии на точки xy я получаю сообщение об ошибке:
«data» должен быть фреймом данных или другим объектом, который можно принудительно вызвать с помощью «fortify ()», а не объектом S3 с значениями классаactive.
Мне кажется, проблема в том, что я неправильно адресую значения из "gate1".
Я повторил эту проблему в небольшом примере из набора данных mtcars (см. Ниже).
Буду признателен за любую помощь,
спасибо Алекс
library(ggplot2)
library(shiny)
ui <- fluidPage(# Some custom CSS for a smaller font for preformatted text
tags$head(tags$style(
HTML("
pre, table.table {
font-size: smaller;
}
")
)),
fluidRow(column(width = 4, wellPanel(
radioButtons("plot_type", "Plot type",
c("base", "ggplot2"))
)),
column(
width = 4,
# In a plotOutput, passing values for click, dblclick, hover, or brush
# will enable those interactions.
plotOutput(
"plot1",
height = 350,
# Equivalent to: click = clickOpts(id = "plot_click")
click = "plot_click",
dblclick = dblclickOpts(id = "plot_dblclick"),
hover = hoverOpts(id = "plot_hover"),
brush = brushOpts(id = "plot_brush")
)
)))
server <- function(input, output) {
gate1 <- reactiveValues(x = NULL, y = NULL)
observeEvent(input$plot_click, {
# Initially will be empty
if (is.null(input$plot_click)) {
return()
}
gate1$x <- c(gate1$x, input$plot_click$x)
gate1$y <- c(gate1$y, input$plot_click$y)
})
output$plot1 <- renderPlot({
gplot <- ggplot(mtcars, aes(wt, mpg)) + geom_point()
if (length(gate1$x > 3))
{
gate <- isolate(gate1)
gplot <-
gplot + geom_polygon(data = gate, aes(fill = "green"))
}
return(gplot)
})
}
shinyApp(ui, server)`