我需要在我的闪亮应用程序中动态生成用户界面。这涉及到使用insertUI在某些条件下将rpivotTable插入到UI页面。我发现我只能成功地做到这一点。移除该元素并重新插入后,该元素不会出现。此问题仅与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)有什么建议可以解决这个问题吗?
发布于 2019-04-10 22:37:36
此问题也作为问题发布在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使用新的唯一Id。
https://stackoverflow.com/questions/55534814
复制相似问题