是否可以在R Shiny中动态设置窗口小部件选项?

时间:2014-04-28 07:06:23

标签: r shiny

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

# 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)
            )
        )
    }
))

相应的浏览器输出:

enter image description here

我应该能够通过单击&#34;切换分页&#34;来打开和关闭选项bPaginate。按钮。

但是,这不起作用 - 表永远不会分页。出了什么问题?

3 个答案:

答案 0 :(得分:1)

我也在努力处理数据表小部件。当选项作为简单列表给出时,renderDataTableDT::renderDataTable似乎都无法识别并重新呈现输出。

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

但是,我不能让Yihui的答案适用于DT版本的DataTable包。也许这只是我的错误,但我最终想出另一种方法来获取用户输入以影响表选项而不使用选项功能。这样做需要一个额外的(反应性)变量层并使用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() )
   }
))

答案 1 :(得分:0)

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

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

请注意,这需要闪亮的&gt; = 0.9.0。

答案 2 :(得分:0)

感谢Stuart。您的示例立即可用。

这是您的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")

```