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