2016-10-24 13 views
0

Мне интересно, что лучше всего подходит для обработки динамического количества данных. Вот пример игрушка:Создание динамического числа данных без переоценки

library(shiny) 
library(DT) 
ui <- shinyUI(fluidPage(
    mainPanel(
    sliderInput("number","Number of tables",1,10,1,1), 
    uiOutput("tables") 
))) 

server <- shinyServer(function(input, output, session) { 

    observe({ 
    lapply(seq_len(input$number), function(i) { 
     output[[paste0("table",i)]] <- DT::renderDataTable(head(mtcars)) 
    }) 
    }) 

    output$tables <- renderUI({ 
    lapply(seq_len(input$number), function(i) { 
     DT::dataTableOutput(paste0("table",i)) 
    }) 
    }) 


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

Этот подход является своего рода тупой инструмент, потому что вы должны засавить все DataTables, когда добавляется или удаляется один DataTable.

Есть ли лучший подход к динамическому генерации вывода, который не требует создания всего выходного сигнала в цикле и, следовательно, воссоздает весь вывод каждый раз, когда есть изменение?

+0

Я думаю, что 'insertUI' и' removeUI' в Shiny 0.14 будут работать. –

+0

Спасибо @warmoverflow. – Carl

ответ

1

Я автор insertUI и removeUI. Похоже, вы обнаружили ошибку в insertUI, когда она применяется к интерактивным выходам. Я подал issue for this in the Shiny repo и постараюсь добраться до него в ближайшее время. В то же время обходным путем является использование where = "beforeBegin" вместо where = "beforeEnd" при звонке insertUI(). См. my answer к оригинальной проблеме, поданной в DT repo для получения более подробной информации.

+0

Большое спасибо за помощь – Carl

1

[Редактировать] Ответ был обновлен с обходным от @ Bárbara Borges (см ее ответ подробности о том, почему он работает)

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

library(shiny) 
library(DT) 

numUI <- 0 

ui <- shinyUI(fluidPage(
    mainPanel(
    sliderInput("number","Number of tables",1,10,1,1), 
    tags$div(id="tables") 
))) 

server <- shinyServer(function(input, output, session) { 

    observe({ 
    if (input$number > numUI) { 
     for (num in (numUI+1):input$number) { 
     insertUI("#tables", "beforeBegin", DT::dataTableOutput(paste0("table", num))) 
     output[[paste0("table",num)]] <- DT::renderDataTable(head(mtcars), server = FALSE) 
     } 
    } 

    if (input$number < numUI) { 
     for (num in (input$number+1):numUI) { 
     removeUI(paste0("#table", num)) 
     } 
    } 

    numUI <<- input$number 
    }) 

}) 
# Run the application 
shinyApp(ui = ui, server = server) 
+0

Он работает, если вы установите 'server = FALSE', но я понятия не имею, почему. – Carl

+0

Поцарапать это. Это рендеринг, это просто делает это быстрее. – Carl

+0

Я напишу о проблеме на github. – Carl

 Смежные вопросы

  • Нет связанных вопросов^_^