根据此页面上提供的信息,我制作了一个绘图,使用
event_register("plotly_selecting")
来监听数据点上的点击并用它做一些事情。
以下应用程序可以做到这一点。效果很好:
library(shiny)
library(plotly)
ui <- fluidPage(
plotlyOutput("plot"),
verbatimTextOutput("click")
)
server <- function(input, output, session) {
nms <- row.names(mtcars)
output$plot <- renderPlotly({
p <- plot_ly(mtcars, x = ~mpg, y = ~wt, customdata = nms)
p %>%
layout(dragmode = "select") %>%
event_register("plotly_selecting")
})
output$click <- renderPrint({
d <- event_data("plotly_click")
if (is.null(d)) "Click events appear here (double-click to clear)" else d
})
}
shinyApp(ui, server)
我在shinyapps.io 上发布了我的应用程序。然后我想看看它在我的智能手机上的样子。我发现,显然,点击不会在小屏幕上注册。您可以看到上面的应用程序在桌面屏幕上运行良好:您单击一个数据点,事件就会被注册。
但是,如果您通过 DevTools 更改为智能手机屏幕,您会发现此功能丢失,如下图所示:
那么,如何让
plotly::event_data
和/或 plotly::event_register
在小屏幕上正常工作?
正如评论中提到的,该错误是由于
plotly.js
库中的旧版本 plotly
造成的。
一个快速的黑客修复方法是手动将依赖项更新为更新版本的
plotly.js
(N.B.这没有任何保证,因为切换底层库可能会产生不可预见的后果)
library(here)
library(htmltools)
## download the newest evrsion of plotly
lnk <- "https://cdn.plot.ly/plotly-2.27.0.min.js"
dest_dir <- here("www")
dest_fn <- file.path(dest_dir, basename(lnk))
if (!file.exists(dest_fn)) {
if (!dir.exists(dest_dir)) {
dir.create(dest_dir)
}
download.file(lnk, dest_fn)
}
## switch dependency to newer version
# [...]
output$plot <- renderPlotly({
p <- plot_ly(mtcars, x = ~ mpg, y = ~ wt, customdata = nms,
type = "scatter", mode = "markers")
## if you do not like using internal functions look for `plotly-main` in the deps
idx <- plotly:::plotlyjsBundleIDX(p)
p$dependencies[[idx]] <- htmlDependency("plotly-main",
gsub("^\\D+((\\d+\\.?)+)\\..*$", "\\1", lnk),
src = here("www"),
script = basename(lnk))
p %>%
layout(dragmode = "select") %>%
event_register("plotly_selecting")
})