Можно ли динамически устанавливать параметры виджета в 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)
            )
        )
    }
))

Соответствующий вывод браузера:

Я должен иметь возможность динамически переключать опцию bPaginate включите и выключите, просто нажав кнопку "Переключить страницу".

Однако это не работает - таблица никогда не разбивается на страницы. Что не так?

3 ответа

Я также боролся с виджетом таблицы данных. ни renderDataTable ни DT::renderDataTable появляются для распознавания и повторного рендеринга вывода, когда параметры заданы в виде простого списка.

Ответ Yihui работает для базы Shiny renderDataTable, но я бы никогда не догадался об этом как о решении, и я не могу понять, почему функция будет работать, а простой список - нет. Я предполагаю, что это некоторая внутренняя проблема реализации с базовым Javascript, но это похоже на детали реализации, которые не должны просачиваться в R api.

Я не могу, однако, заставить ответ Ихуэя работать на DT версия пакета DataTable. Возможно, это просто моя ошибка, но в конце концов я решил, что пользовательский ввод может повлиять на параметры таблицы без использования функции для параметров. Для этого требуется один дополнительный (реактивный) переменный слой и используется datatable() функция. (Обратите внимание, что последняя версия DataTable, в которой все это основано, использует разные имена опций, и я использую немного другой интерфейс, чем вопрос, приведенный выше. Ничто из этого не должно изменить основную проблему или ее решение.)

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

Вы можете использовать функцию для возврата параметров DataTable, например,

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

Обратите внимание, это требует блестящего>= 0.9.0.

Спасибо, Стюарт. Ваш пример работает сразу.

Вот ваш код для 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")

```
Другие вопросы по тегам