【问题标题】:Is it possible to set widget options dynamically in R Shiny?是否可以在 R Shiny 中动态设置小部件选项?
【发布时间】:2023-03-21 14:06:01
【问题描述】:

作为一个最小的工作示例,

# An app with a datatable whose pagination option we can toggle with a button
library(shiny)
runApp(list(
    ui = basicPage(
        actionButton("button", label = "Toggle paginate"),
        dataTableOutput("table")
    ),
    server = function(input, output) {
        output$table <- renderDataTable(
            data.frame(x = 1:100, y = input$button),   # Some dummy data
            options = list(
                bPaginate = as.logical(input$button %% 2)
            )
        )
    }
))

对应的浏览器输出:

我应该能够通过单击“切换分页”按钮来动态地打开和关闭选项 bPaginate

但是,这不起作用 - 表格永远不会分页。怎么了?

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    我也为数据表小部件而苦恼。 renderDataTable也不

    Yihui 的答案适用于基本 Shiny renderDataTable,但我永远不会猜到这是一个解决方案,我不明白为什么一个函数会起作用而普通列表不会。我认为这是底层 Javascript 的一些内部实现问题,但这似乎是一个不应该泄漏到 R api 中的实现细节。

    但是,我不能让 Yihui 的答案适用于 DataTable 包的DT 版本。也许这只是我的错误,但我最终想出了另一种方法来让用户输入影响表选项,而不使用选项函数。这样做需要一个额外的(反应性)变量层并使用datatable() 函数。 (请注意,最新的 DataTable 版本都是基于使用不同的选项名称,并且我使用的 ui 与上述问题略有不同。这些都不应该改变基本问题或其解决方案。)

    # An app with a datatable whose pagination option we can toggle with a button
    library(shiny)
    runApp(list(
       ui = fluidPage(
          sidebarLayout(
             sidebarPanel(
                checkboxInput("paging", "Paginate table")
             ),
             mainPanel(
                DT::dataTableOutput("table")
             )
          )
       ),
       server = function(input, output) {
          # Create a new table when input$paging changes
          makeTable <- reactive({
             DT::datatable(
                { data.frame(x= 1:100, y = input$paging)},   # Some dummy data
                options= list(
                   paging = input$paging
                )
             )
          })
          # Render the datatable returned by the reactive function
          output$table <- DT::renderDataTable( makeTable() )
       }
    ))
    

    【讨论】:

      【解决方案2】:

      您可以使用函数返回 DataTable 选项,例如

      options = function() {
        list(
          bPaginate = as.logical(input$button %% 2)
        )
      }
      

      注意,这需要闪亮 >= 0.9.0。

      【讨论】:

        【解决方案3】:

        谢谢斯图尔特。您的示例立即生效。

        这是您的flexdashboard 代码:

        ---
        title: "Datatable Pagination"
        output: flexdashboard::flex_dashboard
        runtime: shiny
        ---
        
        Inputs {.sidebar}
        -------------------------------------
        
        ```{r}
        # shiny inputs defined here
        checkboxInput("paging", "Paginate table")
        ```
        
        
        ## Column
        
        ### Data Table
        
        ```{r}
        
        makeTable <- reactive({
            DT::datatable(
                { data.frame(x= 1:100, y = input$paging)},   # Some dummy data
                options= list(
                    paging = input$paging
                )
            )
        })
        # Render the datatable returned by the reactive function
        output$table <- DT::renderDataTable( makeTable() )
        
        DT::dataTableOutput("table")
        
        ```
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-14
          • 2014-11-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-03
          • 2020-06-18
          • 1970-01-01
          相关资源
          最近更新 更多