Как получить данные выбранного события из графика ggplotly? - PullRequest
0 голосов
/ 29 октября 2019

Мне известно о https://plot.ly/r/shinyapp-plotly-events/, и я использую его как руководство. Но элемент ggplot, который я конвертирую в plotly, является выводом из функции fviz_dend пакета factoextra. Вот минимальный блестящий пример приложения, с которым я работаю:

library(factoextra)
library(plotly)
library(shiny)
library(DT)

ui <- fluidPage(
    plotlyOutput("ggp"),
    verbatimTextOutput("selected_points"),
    DT::dataTableOutput("filtered_table")
)
server <- function(input, output, session) {

    ## ggplot output
    fviz <- fviz_dend(
        x                 = hclust(dist(mtcars)),
        k                 = 5,
        show_labels       = TRUE,
        type              = "phylogenic",
        phylo_layout      = "layout_as_tree",
        color_labels_by_k = TRUE,
        palette           = "igv"
    )

    ## convert to ggplotly
    ggfviz <- ggplotly(fviz)

    ## add keys
    for (i in seq(7, 11)) {
        ggfviz[["x"]][["data"]][[i-5]][["key"]] <-
            as.character(ggfviz[["x"]][["data"]][[i]][["text"]])
    }

    output$ggp <- renderPlotly({
        ggfviz
    })

    output$selected_points <- renderPrint({
        event_data("plotly_selected")[5]
    })

    output$filtered_table <- DT::renderDataTable(
        mtcars[which(rownames(mtcars) == event_data("plotly_selected")[5]), ],
    )
}
shinyApp(ui, server)

Так что я пытаюсь использовать key, к которому обращаются event_data("plotly_selected")[5], чтобы отфильтровать таблицу данных, и пока event_data("plotly_selected")[5]действительно показывает ключ для output$selected_points, он как-то не передается в фильтр данных.

1 Ответ

1 голос
/ 29 октября 2019

Похоже, event_data вернет фрейм данных с несколькими строками. Вместо фильтрации с помощью == вам потребуется %in% вместо того, чтобы увидеть, какие несколько автомобилей содержатся в нескольких возможных вариантах выбора из plotly_selected. Кроме того, даже если вы поднабором по столбцу 5, у вас все еще есть фрейм данных, и вам нужно включить столбец key только для фильтрации (содержащей вектор автомобилей). Это должно работать:

mtcars[which(rownames(mtcars) %in% event_data("plotly_selected")$key), ]

Или

mtcars[which(rownames(mtcars) %in% event_data("plotly_selected")[["key"]]), ]
...