【问题标题】:How to select rows and columns and filter with DT in Shiny?如何在 Shiny 中选择行和列并使用 DT 进行过滤?
【发布时间】:2021-08-22 08:31:37
【问题描述】:

我正在尝试创建一个闪亮的应用程序能够根据用户的选择选择行和列。对于选择列,我使用pickerInput,对于选择行,您可以在代码中看到扩展名“Select”和更多选项(我看到这个post,它工作得很好。)

问题是 我收到此警告,我认为它与选择的类型不兼容。我担心我没有看到的东西会产生更多错误。

警告:Select 扩展无法在服务器端处理模式下正常工作。建议仅在客户端处理模式下使用 Select 扩展(通过在 DT::renderDT() 中设置 server = FALSE)或使用 DT 自己的选择实现(参见 ?DT::datatable 中的 selection 参数)。

另一方面,当我选择“行”时,我不知道如何隐藏“pickerInput”中的“选择输入”和操作按钮。

这是代码:

    library(shiny)
    library(shinyWidgets)
    library(dplyr)

ui <- fluidPage(
  
  # Application title
  titlePanel("Old Faithful Geyser Data"),
  
  # Sidebar with a slider input for number of bins 
  sidebarLayout(
    sidebarPanel(
      radioButtons("type_select", "What do you want to select?",
                   c("Rows" = "Rows",
                     "Columns" = "Columns")),
      uiOutput("picker"),
      actionButton("view", "View Selection")
      
    ),
    
    # Show a plot of the generated distribution
    mainPanel(
      h2('Mydata'),
      DT::dataTableOutput("table"),
    )
  )
)

library(shiny)
library(DT)

server <- function(session, input, output) {
  
  data <- reactive({
    iris
  })
  
  output$picker <- renderUI({
    pickerInput(inputId = 'pick', 
                label = 'Choose', 
                choices = colnames(data()),
                options = list(`actions-box` = TRUE),multiple = T)
  })
  
  datasetInput <- eventReactive(input$view,{
    
    datasetInput <- data() %>% 
      select(input$pick)
    
    return(datasetInput)
    
  })
  
  output$table <- renderDT({
    if(input$type_select == "Rows"){
        datatable(
          data(),
          selection = "none",
          filter="top", 
          rownames = FALSE,
          extensions = c("Buttons", "Select"),
          
          options = list(
            select = TRUE,
            dom = 'Blfrtip',
            buttons =
              list('copy', 'print', list(
                extend = 'collection',
                buttons = list(
                  list(extend = 'csv', filename = "File", title = NULL,
                       exportOptions = list(modifier = list(selected = TRUE))),
                  list(extend = 'excel', filename = "File", title = NULL,
                       exportOptions = list(modifier = list(selected = TRUE)))),
                text = 'Download'
              ))
          ),
          class = "display"
        )
    }else{
        datatable(
          datasetInput(),
          filter="top", 
          rownames = FALSE,
          extensions = 'Buttons',
          
          options = list(
            dom = 'Blfrtip',
            buttons =
              list('copy', 'print', list(
                extend = 'collection',
                buttons = list(
                  list(extend = 'csv', filename = "File", title = NULL),
                  list(extend = 'excel', filename = "File", title = NULL)),
                text = 'Download'
              ))
          ),
          class = "display"
        )
      }
  })
}


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

接下来,我将向您展示该应用程序的一些屏幕截图,以解释其工作原理。

如果您选择“行”:

如果您选择“列”:

其实,如果你想检查选择是否顺利,你可以下载一个文件(例如excel),你会看到你的选择是好的。

但是,我不知道如何解决我上面解释的问题。

有人可以帮帮我吗?我很绝望。

提前非常感谢

【问题讨论】:

    标签: r shiny datatable dt pickerinput


    【解决方案1】:

    为了摆脱警告将renderDT更改为DT::renderDataTable并在其中设置server = FALSE

    这是完整的代码-

    ui <- fluidPage(
      
      # Application title
      titlePanel("Old Faithful Geyser Data"),
      
      # Sidebar with a slider input for number of bins 
      sidebarLayout(
        sidebarPanel(
          radioButtons("type_select", "What do you want to select?",
                       c("Rows" = "Rows",
                         "Columns" = "Columns")),
          uiOutput("picker"),
          actionButton("view", "View Selection")
          
        ),
        
        # Show a plot of the generated distribution
        mainPanel(
          h2('Mydata'),
          DT::dataTableOutput("table"),
        )
      )
    )
    
    library(shiny)
    library(DT)
    
    server <- function(session, input, output) {
      
      data <- reactive({
        iris
      })
      
      output$picker <- renderUI({
        pickerInput(inputId = 'pick', 
                    label = 'Choose', 
                    choices = colnames(data()),
                    options = list(`actions-box` = TRUE),multiple = T)
      })
      
      datasetInput <- eventReactive(input$view,{
        
        datasetInput <- data() %>% 
          select(input$pick)
        
        return(datasetInput)
        
      })
      
      output$table <- DT::renderDataTable(server = FALSE,{
        if(input$type_select == "Rows"){
          datatable(
            data(),
            selection = "none",
            filter="top", 
            rownames = FALSE,
            extensions = c("Buttons", "Select"),
            
            options = list(
              select = TRUE,
              dom = 'Blfrtip',
              buttons =
                list('copy', 'print', list(
                  extend = 'collection',
                  buttons = list(
                    list(extend = 'csv', filename = "File", title = NULL,
                         exportOptions = list(modifier = list(selected = TRUE))),
                    list(extend = 'excel', filename = "File", title = NULL,
                         exportOptions = list(modifier = list(selected = TRUE)))),
                  text = 'Download'
                ))
            ),
            class = "display"
          )
        }else{
          datatable(
            datasetInput(),
            filter="top", 
            rownames = FALSE,
            extensions = 'Buttons',
            
            options = list(
              dom = 'Blfrtip',
              buttons =
                list('copy', 'print', list(
                  extend = 'collection',
                  buttons = list(
                    list(extend = 'csv', filename = "File", title = NULL),
                    list(extend = 'excel', filename = "File", title = NULL)),
                  text = 'Download'
                ))
            ),
            class = "display"
          )
        }
      })
    }
    
    
    # Run the application 
    shinyApp(ui = ui, server = server)
    

    【讨论】:

    • 谢谢!!但是,您是否知道该选项为假是否会产生问题?据我了解阅读警告,它将从服务器端更改为客户端(我真的不知道这意味着什么)
    • 老实说,我不知道这可能会影响的所有事情,但我没有遇到任何问题。
    • 我认为它运行良好,但server=F 产生我无法根据您拥有的条目下载文件。例如,如果您只显示 10 个条目,而您只想下载 10 个条目,则无法执行此操作,因为您将下载整个表格。这太好了,不可能是真的。还是谢谢
    【解决方案2】:

    我找到了所有问题的完整解决方案:

    • 警告(感谢 Ronak Shah 的回答)

    • 当我选择“行”时,如何从“pickerInput”和操作按钮中隐藏“选择输入”。感谢post

      library(shiny)
      library(shinyWidgets)
      library(dplyr)
      
      ui <- fluidPage(
      
      # Application title
      titlePanel("Old Faithful Geyser Data"),
      
      # Sidebar with a slider input for number of bins 
      sidebarLayout(
        sidebarPanel(
          radioButtons("type_select", "What do you want to select?",
                       c("Rows" = "Rows",
                         "Columns" = "Columns")),
      
          conditionalPanel(
            condition = "input.type_select == 'Columns'",
            uiOutput("picker"),
            actionButton("view", "View Selection")        
          )
      
        ),
      
        # Show a plot of the generated distribution
        mainPanel(
          h2('Mydata'),
          DT::dataTableOutput("table"),
        )
      )
      )
      
      
      library(shiny)
      library(DT)
      
      server <- function(session, input, output) {
      
      data <- reactive({
        iris
      })
      
      output$picker <- renderUI({
        pickerInput(inputId = 'pick', 
                    label = 'Choose', 
                    choices = colnames(data()),
                    options = list(`actions-box` = TRUE),multiple = T)
      })
      
      datasetInput <- eventReactive(input$view,{
      
        datasetInput <- data() %>% 
          select(input$pick)
      
        return(datasetInput)
      
      })
      
      output$table <- DT::renderDataTable(server = FALSE,{
        if(input$type_select == "Rows"){
          datatable(
            data(),
            selection = "none",
            filter="top", 
            rownames = FALSE,
            extensions = c("Buttons", "Select"),
      
            options = list(
              select = TRUE,
              dom = 'Blfrtip',
              buttons =
                list('copy', 'print', list(
                  extend = 'collection',
                  buttons = list(
                    list(extend = 'csv', filename = "File", title = NULL,
                         exportOptions = list(modifier = list(selected = TRUE))),
                    list(extend = 'excel', filename = "File", title = NULL,
                         exportOptions = list(modifier = list(selected = TRUE)))),
                  text = 'Download'
                ))
            ),
            class = "display"
          )
        }else{
          datatable(
            datasetInput(),
            filter="top", 
            rownames = FALSE,
            extensions = 'Buttons',
      
            options = list(
              dom = 'Blfrtip',
              buttons =
                list('copy', 'print', list(
                  extend = 'collection',
                  buttons = list(
                    list(extend = 'csv', filename = "File", title = NULL),
                    list(extend = 'excel', filename = "File", title = NULL)),
                  text = 'Download'
                ))
            ),
            class = "display"
          )
        }
      })
      }
      
      
      # Run the application 
      shinyApp(ui = ui, server = server)
      

    添加条件面板后的一些截图:

    如果您选择行...

    如果您选择列...

    警告。如果您只想选择 X 列以下载它们,则此解决方案不起作用(例如,您只想下载 25 个条目,但如果您下载文件,您将没有 25 个条目,您将拥有一切。

    【讨论】:

      猜你喜欢
      • 2019-07-17
      • 2016-04-19
      • 2018-06-22
      • 2020-10-31
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      • 2015-09-13
      • 2021-03-25
      相关资源
      最近更新 更多