Укажите ширину столбца для первых n переменных, где n - это переменная, зависящая от селектора ввода - PullRequest
0 голосов
/ 04 мая 2020

У меня есть приложение с данными DT. Таблица группируется по некоторым указанным измерениям, введенным пользователем. Если пользователь указывает 1,2,3 или 4 группирующих переменных, я бы хотел, чтобы эти переменные имели ширину 100 пикселей.

Полный код для воспроизведения приведен ниже. Указанный кодовый блок c:

   output$eg_table <- DT::renderDT({my_flights_react() }, 
                                   filter = 'top', options = list(dom = 'tip',
                                                                  autoWidth = T,
                                                                  scrollX=T,
                                                                  columnDefs = list(list(width = '100px',
                                                                                         targets = 1:length(input$group_dims)))
                                                                  )
                                   )

Если вместо 1:length(input$group_dims) вместо 1:3, то первые 3 столбца действительно подгонятся под указанную длину. Кажется, что DT или Shiny не могут правильно считывать длину входного ввода $ group_dims.

Как я могу настроить первое число n ширины столбцов, где количество столбцов является переменной, зависящей от пользовательского ввода?

Полный код для воспроизведения, обратите внимание, что только первый столбец отображается как 100px, даже если я выбрал все поля в селекторе:

library(tidyverse)
library(shiny)
library(nycflights13)
library(lubridate)

# Define UI for application that draws a histogram
ui <- fluidPage(

   # Application title
   titlePanel("Example Shiny App"),

   # Sidebar with a slider input for number of bins 
   sidebarLayout(
      sidebarPanel(
        selectInput(inputId = "group_dims", 
                    label =  "group_dims", 
                    choices = c("carrier", "origin", "dest", "tailnum"),
                    selected = c("carrier"),
                    multiple = T) # There can be only one
      ),

      # DT table
      mainPanel(
         DT::dataTableOutput("eg_table")
      )
   )
)

# Define server logic required to draw a histogram
server <- function(input, output) {

  # initial preprocessing
  my_flights <- flights %>% 
    filter(month == 11 & day >= 14) %>% # just data for 2 weeks
    mutate(date = ymd(paste(year, month, day, sep = "-"))) %>% 
    select(date, carrier, origin, dest, tailnum, distance) %>% 
    mutate(date = ordered(format(date, "%d-%b"), levels = format(sort(unique(date)), "%d-%b")))


  # recative preprocessing
  my_flights_react <- reactive({
    dims <- input$group_dims
    my_flights %>%
      group_by_at(vars(date, dims)) %>%
      summarise(distance = sum(distance)) %>%
      pivot_wider(names_from = date, values_from = distance) %>%
      replace(is.na(.), 0) %>% 
      ungroup() %>% 
      add_column(Total = rowSums(select(., -dims), na.rm = T), .after = length(dims)) %>% 
      arrange(desc(Total))
  })


   output$eg_table <- DT::renderDT({my_flights_react() }, 
                                   filter = 'top', options = list(dom = 'tip',
                                                                  autoWidth = T,
                                                                  scrollX=T,
                                                                  columnDefs = list(list(width = '100px',
                                                                                         targets = 1:length(input$group_dims)))
                                                                  )
                                   )
}

# Run the application 
shinyApp(ui = ui, server = server)

Экран: enter image description here

1 Ответ

0 голосов
/ 04 мая 2020

Ваш минимальный пример работает нормально. Столбцы шире, чем без бита columnsDef. (Выбор задней двери вызывает ошибку, но это не имеет значения.)

enter image description here

...