Рендеринг таблиц с автопропусканием и scrollX с использованием пакета R DT - PullRequest
0 голосов
/ 08 января 2020

У меня проблема с рендерингом таблицы с использованием пакета DT. Таблица генерируется на основе событий, выбранных щелчком, в сюжетном графике. Мне нужно, чтобы таблица не занимала всю ширину, если столбцов недостаточно. Итак, согласно виньетке, я добавил следующий код к опциям в функции, датируемой из пакета DT:

 autoWidth = TRUE,
 columnDefs = list(list(className = 'dt-center'
                                         , width = '200px'
                                         , targets = '_all'))

Это приводит к правильному отображению при желании, при первом щелчке, как показано на скриншоте Auto-Click1 .png (см. 1-е изображение). Однако, если я нажму на любую точку во второй раз, полученная таблица будет охватывать всю ширину браузера. (См. Auto-Click2.png или 2-е изображение). Я хотел бы, чтобы таблица отображалась как в Auto-Click1, а рендеринг сохранялся между щелчками.

Чтобы сохранить постоянную ширину между щелчками, я попытался добавить параметр scrollX=TRUE. Это помогает, и ширина сохраняется между щелчками. Но заголовки столбцов теперь не выровнены по левому краю таблицы. См. ScrollX-True.png (см. 3-е изображение).

Вот полный воспроизводимый пример:

    ---
    title: "Dashboard with DT and plotly.  Reproducible example"
    output: 
      flexdashboard::flex_dashboard:
        orientation: rows
        vertical_layout: fill
    runtime: shiny
    ---

    Dashboard
    ======================

    ```{r setup, include=FALSE}
    library(tidyverse)
    library(tidyselect)
    library(tidyr)
    library(magrittr)
    library(dplyr)
    library(ggplot2)
    library(plotly)
    library(shiny)
    library(shinydashboard)
    library(flexdashboard)
    library(rlang)
    library(DT)
    library(readxl)
    library(writexl)

    ```

    Row 
    -----------------------------------------------------------------------

    ### Plot {.no-padding}

    ```{r}
    data <- mtcars %>%
    rownames_to_column("Model") %>%
    mutate(Make = sub("\\s+.*","", Model))

    ## Plot in the top row
    renderPlotly({
      p <- data %>%
        ggplot(aes(wt, mpg, color = factor(gear))) +
        geom_point() + guides(color=guide_legend("Gear"))
      ggplotly(p,source = "A") %>%
        event_register("plotly_click")
    })
    ```



    Row
    ---------------------------------------


    ### Data Table 

    ```{r tbl}
    renderUI({
      e <- event_data("plotly_click", priority = "event", source = "A")
      chosen_gear <- data %>% 
        pull(gear) %>% 
        unique() %>% 
        sort() %>% 
        .[e[1,"curveNumber"] + 1]

      if(is.null(e))
        return("Click events will appear here")

      DF <- data %>% 
        filter(gear == chosen_gear) %>% 
        dplyr::select(Model, wt, mpg, gear, Make)

      tbl <- DF  %>%
        datatable(rownames = FALSE
                  , extensions = 'Buttons'
                  , options = list(
                    ##scrollX = TRUE, 
                    # Turning the scrollX option on causes Column headers to misalign with rest of the table
                    # Without the scrollX option table has correct width on first click but
                    # On the second click expands to the full width.
                    autoWidth = TRUE
                    , columnDefs = list(list(className = 'dt-center'
                                             , width = '200px'
                                             , targets = '_all'))
                    , dom = "Blrtip"
                    , buttons = list("copy", list(
                      extend = "collection"
                      , buttons = c("csv", "excel", "pdf")
                      , text = "Download"
                    ))
                    , lengthMenu = list(c(5, -1)
                                        , c(5, "All"))
                    , pageLength = 5))

      output$table <- renderDT({tbl})

      DTOutput("table")
    })

Auto-Click1

Auto-Click2

ScrollX-True

Спасибо за вашу помощь или указатели.

1 Ответ

0 голосов
/ 17 января 2020

Как ответили в https://github.com/rstudio/DT/issues/752#issuecomment -575706297 , самый простой способ, о котором я могу думать, это изменение последней строки с DTOutput('tbl') на

div(style = 'width:500px;margin:auto', DTOutput("table"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...