[英]Change plot based on click input in R shiny
对于我的应用程序,我需要用户单击地块上的某个区域,然后该地块会对该点击做出响应,并显示链接到该输入点击的新地块。
但是,当前它正在运行,但是新图仅显示3秒钟,然后返回到原始图。 我在这里找到了类似的例子。 此图基于反应性值列表进行更新,然后绘制用户选择的那些新点。 我认为,如果我找到了一种方法,可以在单击事件之后立即对其进行修改以绘制新图,则它应该可以工作,但是会卡在这部分上。
因此,理想情况下,下面的示例将在单击beind之后立即添加新点。 就我而言,我将需要显示新图,直到单击图的新区域。
链接示例
library(shiny)
ui <- basicPage(
plotOutput("plot1", click = "plot_click"),
verbatimTextOutput("info"),
actionButton("updateplot", "Update Plot:")
)
server <- function(input, output) {
val <- reactiveValues(clickx = NULL, clicky = NULL)
observe({
input$plot_click
isolate({
val$clickx = c(val$clickx, input$plot_click$x)
val$clicky = c(val$clicky, input$plot_click$y)
})
}) #adding clicks to list
output$plot1 <- renderPlot({
plot(mtcars$wt, mtcars$mpg)
input$updateplot
isolate({
points(val$clickx, val$clicky)
})
})
output$info <- renderText({
paste0("x = ", val$clickx, ", y = ",val$clicky, "\n")
})
}
shinyApp(ui, server)
此示例显示了一个主图,并且在单击主图时它显示了一个子图。 再次单击,将再次显示主图。
这个想法是,只要发生点击,计数器( trigger
)就会增加。 在观察者中使用req(.)
很重要,以免观察者在释放鼠标按钮时再次触发(在这种情况下, input$plot_click
设置为NULL
)。
然后renderPlot(.)
对此trigger
进行依赖,并显示主图或子图。
更新。 如果要使用input$plot_click
对象中的信息,则也应保存该信息,以免该信息变为NULL
。
library(shiny)
library(ggplot2)
ui <- basicPage(
plotOutput("plot1", click = "plot_click")
)
server <- function(input, output) {
plot_data <- reactiveValues(trigger = 0, x = NA, y = NA)
observe({
req(input$plot_click)
isolate(plot_data$trigger <- plot_data$trigger + 1)
plot_data$x <- input$plot_click$x
plot_data$y <- input$plot_click$y
})
output$plot1 <- renderPlot({
if (plot_data$trigger %% 2 == 0) {
plot(1:10, main = "Main Plot")
} else {
ggplot() + geom_point(aes(x = plot_data$x, y = plot_data$y), size = 5, shape = 19)
}
})
}
shinyApp(ui, server)
只需将isolate
放入renderPlot中:
library(shiny)
ui <- basicPage(
plotOutput("plot1", click = "plot_click"),
verbatimTextOutput("info")
)
server <- function(input, output) {
val <- reactiveValues(clickx = NULL, clicky = NULL)
observe({
input$plot_click
isolate({
val$clickx = c(val$clickx, input$plot_click$x)
val$clicky = c(val$clicky, input$plot_click$y)
})
}) #adding clicks to list
output$plot1 <- renderPlot({
plot(mtcars$wt, mtcars$mpg)
points(val$clickx, val$clicky)
})
output$info <- renderText({
paste0("x = ", val$clickx, ", y = ",val$clicky, "\n")
})
}
shinyApp(ui, server)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.