对于我的应用程序,我需要用户单击绘图上的某个区域,然后绘图响应该单击并显示链接到该输入点击的新绘图。
但是,当前它正在运行,但是新图仅显示3秒钟,然后返回到原始图。我找到了类似的示例here。此图基于反应性值列表进行更新,然后绘制用户选择的那些新点。我认为,如果我找到一种方法可以对其进行修改,以在单击事件之后立即绘制新图,则它应该可以工作,但是会卡在这部分上。
因此,理想情况下,下面的示例将在单击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)
答案 0 :(得分:2)
此示例显示一个主图,单击主图则显示一个子图。再次单击它会再次显示主图。
这个想法是,只要发生点击,计数器(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)
答案 1 :(得分:1)
只需将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)