单击以从闪亮的多个直方图中获取坐标

Click to get coordinates from multiple histogram in shiny

我们如何在 shiny.h 中获取多个直方图的交互坐标(x 和 y)。我试过这段代码

#server.R
library(xts)  
shinyServer(function(input, output,session) {
output$info <- renderText({
    paste0("x=", input$plot_click$x, "\ny=", input$plot_click$y)
  })


output$plot<- renderPlot({ 
set.seed(3)
Ex <- xts(1:100, Sys.Date()+1:100)
df = data.frame(Ex,matrix(rnorm(100*3,mean=123,sd=3), nrow=100))
df<-df[,-1]
par(mfrow = c(2,2))
for(i in names(df)){
 hist(df[[i]] , main=i,xlab="x",freq=TRUE,label=TRUE,plot = TRUE)  
}

})
})

ui.R

#ui.r
mainPanel(

      tabsetPanel(type="tab",tabPanel("plot", plotOutput("plot",click = "plot_click"), verbatimTextOutput("info"))         

  )

上面代码的问题是我像这样得到整个地块的随机坐标

x=124.632301932263
y=20.4921068342051

相反,我想获取各个地块的坐标及其相应的值。例如,如果我单击 X1 图表中的任何位置,我应该获得该图表的 x 和 y 坐标。我该怎么做?

我本来想说这是因为点击是由绘图的像素而不是数据决定的,但事实证明我错了here:

Notice that the x and y coordinates are scaled to the data, as opposed to simply being the pixel coordinates. This makes it easy to use those values to select or filter data.

我会诚实地猜测,在图形设备中,Shiny 无法区分各个绘图之间的区别,解决方案是为每个绘图创建单独的设备:

ui.R

library(shiny)
shinyUI(
  tabsetPanel(type="tab",
              tabPanel("plot", 
                       uiOutput("coords"),
                       uiOutput("plots")
                       )
              )
)

server.R

library(xts)  
set.seed(3)

Ex <- xts(1:100, Sys.Date() + 1:100)
df <- data.frame(Ex, matrix(rnorm(100*3, mean = 123, sd = 3), nrow = 100))
cn <- colnames(df)
df <- df[, cn[cn != "Ex"]]

n_seq <- seq(ncol(df))
shinyServer(function(input, output, session) {

  output$plots <- renderUI({
    plot_output_list <- lapply(n_seq, function(i) {
      plotOutput(paste0("plot", i), click = paste0("plot_click", i),
                 height = 250, width = 300)
    })
  })

  for (i in n_seq) {
    output[[paste0("plot", i)]] <- renderPlot({
      hist(df[[i]] , main = i, xlab = "x", freq = TRUE, label = TRUE)
    })
  }

  output$coords <- renderUI({
    coords_output_list <- lapply(n_seq, function(i) {
      renderText({
        set <- input[[paste0("plot_click", i)]]
        paste0("Plot ", i, ": x=", set$x, "\ny=", set$y)
      })
    })
  })
})