Как динамически вставить rpivotTable в Shiny UI - PullRequest
0 голосов
/ 05 апреля 2019

Мне нужно динамически генерировать пользовательский интерфейс в моем блестящем приложении.Это включает вставку rpivotTable на страницу пользовательского интерфейса при некоторых условиях с помощью insertUI.Я обнаружил, что могу успешно сделать это только один.После удаления элемента и вставки его снова он не появляется.Проблема только с rpivotTable.Все остальные элементы интерфейса, такие как dataTable, actionButton и так далее, работают хорошо.Вот пример кода, воспроизводящего проблему:

library(shiny)
library(rpivotTable)

ui<- fluidPage(title="test page",
  actionButton("A","insert pivot"),
  actionButton("B","remove pivot")
)

server<- function (input, output, session)
{
  ds<-data.frame(a="1",b="2")

  observeEvent(input$A,{
    cat("insert\n")
    insertUI(selector="#B",
             where="afterEnd",
             ui=rpivotTableOutput("C"),
             immediate = T)
    output$C <- renderRpivotTable({ rpivotTable(data = ds) })
  })

  observeEvent(input$B,{
    cat("remove\n")
    removeUI(selector="div#C",immediate = T)
  })
}

shinyApp(ui,server)

Кто-нибудь посоветует, как решить эту проблему?

1 Ответ

0 голосов
/ 10 апреля 2019

Этот вопрос был также опубликован как проблема в rpivotTable GitHub, и на него был дан ответ с кодом решения ниже:

library(shiny)
library(rpivotTable)

ui<- fluidPage(title="test page",
               actionButton("A","insert pivot"),
               actionButton("B","remove pivot"),
               div(id = 'placeholder') 
)

server<- function (input, output, session)
{
  ds<-data.frame(a="1",b="2")
  inserted <- c()

  observeEvent(input$A, {
    btn <- input$A
    id <- paste0('txt', btn)
    insertUI(
      selector = '#placeholder',
      ## wrap element in a div with id for ease of removal
      ui = div(
        rpivotTable(ds), 
        id = id
      ))
    inserted <<- c(id, inserted)
  })
  observeEvent(input$B, {
    removeUI(
      ## pass in appropriate div id
      selector = paste0('#', inserted[length(inserted)])
    )
    inserted <<- inserted[-length(inserted)]
  })
}

shinyApp(ui,server)

Я предполагаю, что решение в основном заключается в использовании нового уникального идентификатора для каждого нового insertUI.

...