关于graphics::locator()函数无法在Shiny应用内使用的技术咨询
为什么
graphics::locator()无法在Shiny应用里正常工作? 核心原因
graphics::locator()是基础绘图系统的交互式工具,它只能和RStudio自带的原生绘图设备(就是你看到的常规绘图标签页)交互,依赖这个设备捕获鼠标点击坐标。但Shiny的绘图是在网页端的独立环境里渲染的,和RStudio的原生绘图设备完全隔离,所以locator根本抓不到Shiny界面里的鼠标操作,只能在原生绘图标签页里输出结果。- 另外,Shiny的网页绘图是用HTML/CSS/JS实现的,基础绘图的这类交互式函数(比如
locator()、identify())根本没适配网页端的交互逻辑,自然没法在Shiny界面里生效。
替代方案
用Shiny原生的点击事件替代
Shiny的plotOutput自带click参数,能直接捕获绘图区域的点击坐标,完全能代替locator()的功能,示例代码如下:
library(shiny) ui <- fluidPage( plotOutput("my_plot", click = "plot_click"), verbatimTextOutput("click_info") ) server <- function(input, output) { output$my_plot <- renderPlot({ plot(1:10, 1:10) }) output$click_info <- renderPrint({ req(input$plot_click) cat("点击坐标:x =", input$plot_click$x, ",y =", input$plot_click$y) }) } shinyApp(ui, server)
用交互式绘图包实现更复杂交互
如果需要更灵活的交互效果,可以用plotly这类基于JS的绘图包,它本身就适配Shiny的网页环境,能轻松捕获鼠标操作:
library(shiny) library(plotly) ui <- fluidPage( plotlyOutput("my_plot"), verbatimTextOutput("click_info") ) server <- function(input, output) { output$my_plot <- renderPlotly({ plot_ly(x = 1:10, y = 1:10, type = "scatter", mode = "markers") }) output$click_info <- renderPrint({ req(input$my_plot_click) click_data <- input$my_plot_click cat("点击坐标:x =", click_data$x, ",y =", click_data$y) }) } shinyApp(ui, server)
内容的提问来源于stack exchange,提问作者Felipe Kowalski
相关产品推荐
相关产品推荐

