Событие Click, не инициируемое внутри субплота Plotly в Shiny - PullRequest
1 голос
/ 05 июля 2019

Я создаю приложение с 2 различными вкладками. У каждого из них есть пара сюжетов. Я хочу, чтобы графики реагировали только на события plotly_click из соответствующей вкладки. Моя проблема возникает, когда вместо того, чтобы разделить участки, я хочу, чтобы один из них был частью подзаговора.

Для этого я добавил параметр source к графикам, чтобы определить, какой график был выбран. Когда графики представляют собой отдельные графики (а не внутри подпрограммы), они работают хорошо, но если я попытаюсь поместить один из них в составной участок, никакие события, связанные с этим графиком, не будут вызваны.

Рабочий код выглядит примерно так:

ui <- navbarPage("",  
    tabPanel("Tab1",
        plotlyOutput("tab1plot1"),
        plotlyOutput("tab1plot2")
    ),
    tabPanel("Tab2",
        plotlyOutput("tab2plot1"),
        plotlyOutput("tab2plot2")
    )
)

server <- function(input, output, session) {
    output$tab1plot1 <- renderPlotly({
        plot_ly(x = dates, y = y, source = "tab1plot1", ...)
    })

    output$tab1plot2 <- renderPlotly({
        click <- event_data("plotly_click", source = "tab1plot1")
        if (!is.null(click)) {
            # process click
            plot_ly(x = dates, y = processedY, ...)
        }
        else { NULL }
    })

    output$tab2plot1 <- renderPlotly({
        plot_ly(source = "tab2plot1", ...)
    })

    output$tab2plot2 <- renderPlotly({
        click <- event_data("plotly_click", source = "tab2plot1")
        if (!is.null(click)) {
            # process click ...
        }
        else { ... }
    })

Это работает, как и ожидалось, но проблема возникает, когда я пытаюсь изменить tab1plot1 для составного субплана следующим образом:

server <- function(input, output, session) {
    output$tab1plot1 <- renderPlotly({
        p1 <- plot_ly(x = dates, y = y, source = "tab1plot1", ...)
        p2 <- plot_ly( ... )
        subplot(p1, p2, nrows = 2, shareX = TRUE)
    })

   ...
}

Если я это сделаю, событие plotly_click никогда не будет запущено, и поэтому tab1plot2 никогда не изменяется. На самом деле, я получаю сообщение журнала: «Предупреждение: может быть только один: источник Предупреждение. Событие plotly_click, связанное с идентификатором источника main, не зарегистрировано. Чтобы получить данные этого события, добавьте event_register(p, 'plotly_click') к графику (p), из которого вы хотите получить данные события. "

Я что-то упустил или сюжет просто не поддерживает атрибут source внутри подзаговора?

1 Ответ

0 голосов
/ 09 июля 2019

Plotly поддерживает source с subplot; вам просто нужно указать один и тот же идентификатор источника для всех графиков в этом участке. Один способ, который будет работать, это:

output$tab1plot1 <- renderPlotly({
    p1 <- plot_ly(x = dates, y = y, ...)
    p2 <- plot_ly( ... )
    s <- subplot(p1, p2, nrows = 2, shareX = TRUE)
    s$x$source <- "tab1plot1"
    s
})

Ссылка: https://github.com/ropensci/plotly/issues/1504

...