Ширина столбца с использованием dt в блестящем приложении

Abild спросил: 28 апреля 2018 в 09:05 в: r

Есть ли способ предотвратить изменение размера таблицы после обновления данных через выпадающее меню?

Я знаю, что это точно такой же вопрос, как в R shiny - DT :: renderDataTable ширина столбца , но насколько я знаю, вопрос никогда не был достаточно отвечен.

library(shiny)
library(tidyr)
library(dplyr)
library(DT)ui <- fluidPage(selectInput(inputId = "dayinput", 
                            label = "Day Filter", 
                            choices = c("Monday", "Tuesday","Wednesday")), 
                dataTableOutput("table1")
                )server <- function(input, output) {  output$table1 <- renderDataTable({
    price <- c("12", "11", "14")
    day <- c("Monday", "Tuesday", "Wednesday")
    df <- data.frame(price, day) %>% filter(day == input$dayinput)    datatable(df, rownames = FALSE, class = 'cell-border stripe', 
              options = list(dom = 't', pageLength = -1, lengthMenu = list(c(-1), c('All')),
                             autoWidth = TRUE, columnDefs = list(list(width = '50px', targets = "_all"))))
  })
}shinyApp(ui =ui, server = server)

1 ответ

SeGa ответил: 03 мая 2018 в 12:30

Я думаю, что неправильно понял вопрос с первого взгляда. В любом случае, я думаю, вы могли бы добиться этого с помощью некоторого CSS-стиля.

Это всего лишь небольшой пример:

library(shiny)
library(tidyr)
library(dplyr)
library(DT)ui <- fluidPage(
  tags$head(
    tags$style(HTML(
      "
#table1 {width: 250px !important}
#DataTables_Table_0 td {width: 125px !important}
      "
    ))
    ),
  selectInput(inputId = "dayinput", 
              label = "Day Filter", 
              choices = c("Monday", "Tuesday","Wednesday","Thuuuuuuuuuuuuuuuursday")), 
  dataTableOutput("table1")
)server <- function(input, output) {  output$table1 <- renderDataTable({
    price <- c("12", "11", "14", "15")
    day <- c("Monday", "Tuesday", "Wednesday","Thuuuuuuuuuuuuuuuursday")
    df <- data.frame(price, day) %>% filter(day == input$dayinput)    datatable(df, rownames = FALSE, class = 'cell-border stripe', 
              options = list(dom = 't', pageLength = -1, lengthMenu = list(c(-1), c('All')),
                             autoWidth = FALSE)
    )
  })
}shinyApp(ui =ui, server = server)
Abild ответил: 29 апреля 2018 в 05:01
Да, как правило, это сработает, к сожалению, я не знаю количества столбцов заранее, что затрудняет предопределение соответствующей ширины таблицы.
SeGa ответил: 29 апреля 2018 в 06:31
Можете ли вы определить фиксированную ширину и добавить scrollX = TRUE к параметрам datable? Или исправить это с помощью css?
Abild ответил: 02 мая 2018 в 01:41
Вы имеете в виду фиксированную ширину столбца? если да, можете ли вы показать примерный код? Если вы имеете в виду фиксированную ширину таблицы, я не вижу использования scrollX?
SeGa ответил: 03 мая 2018 в 12:32
Я редактировал свой ответ. Вы можете определить ширину столбца и css-правила. Допустим, у вас есть таблица с 20 столбцами, и у вас просто ограниченное пространство в приложении, вы можете определить фиксированную максимальную ширину таблицы. Если ширина таблицы больше заданного пространства, scrollX определенно имеет смысл.
Abild ответил: 04 мая 2018 в 09:49
Большое спасибо. Ваша помощь очень ценится!