Shiny技术问题:如何获取绘图区多次点击的X、Y轴坐标
实现Shiny绘图区多次点击坐标记录
要记录绘图区的多次点击坐标,核心是用Shiny的reactiveValues来持久化保存点击历史,每次触发点击事件时将新坐标追加到历史记录中,最后统一展示所有记录。
以下是修改后的完整代码:
library(shiny) ui <- basicPage( plotOutput("plot1", click = "plot_click", hover = "plot_hover" ), verbatimTextOutput("info") ) server <- function(input, output) { # 创建响应式对象存储点击历史 rv <- reactiveValues(click_history = data.frame(x = numeric(), y = numeric())) output$plot1 <- renderPlot({ plot(mtcars$wt, mtcars$mpg) }) # 监听点击事件,追加新坐标到历史记录 observeEvent(input$plot_click, { new_click <- data.frame( x = round(input$plot_click$x, 1), y = round(input$plot_click$y, 1) ) rv$click_history <- rbind(rv$click_history, new_click) }) output$info <- renderText({ xy_str <- function(e) { if(is.null(e)) return("NULL\n") paste0("x=", round(e$x, 1), " y=", round(e$y, 1), "\n") } # 拼接历史点击记录 history_str <- if(nrow(rv$click_history) == 0) { "暂无点击记录\n" } else { paste0("历史点击记录:\n", apply(rv$click_history, 1, function(row) paste0("x=", row[1], " y=", row[2], "\n")), collapse = "") } paste0( "当前点击: ", xy_str(input$plot_click), "hover: ", xy_str(input$plot_hover), history_str ) }) } shinyApp(ui, server)
关键部分说明
reactiveValues是Shiny中用来保存响应式状态的对象,这里用它存储点击历史的dataframe,确保每次点击后数据能被持久化并触发后续输出更新。observeEvent(input$plot_click, {...})专门监听绘图区的点击事件,每次点击就将格式化后的x、y坐标追加到历史记录中。- 在输出文本时,判断历史记录是否为空,为空则提示无记录,否则逐行展示所有历史点击的坐标。
内容的提问来源于stack exchange,提问作者Wang
相关产品推荐
相关产品推荐

