在这里,我试图重复我原来的问题。如果您点击“添加细分”,则下面的闪亮代码将创建“子细分”按钮。
现在,“添加子细分”按钮应在每次点击时显示一行文字。但是我注意到的是,它会创建许多行((1 +单击后添加“添加细分”按钮的数量)。
对于单个observeEvent,它正在运行(代码已注释掉)。
library(shiny)
ui <- fluidPage(
verbatimTextOutput("txt",placeholder = T), #"It is Created for Testing"
actionButton("addSeg", "Add a Segment"),
uiOutput("myUI")
)
server <- function(input, output, session) {
alld <- reactiveValues()
alld$ui <- list()
# Action to add new Segment
observeEvent(input$addSeg,{
alld$ui[[length(alld$ui)+1]] <- list(actionButton(paste0("addSub_",(length(alld$ui)+1)), "Add a Sub Segment"))
})
# Action to add new Sub Segment
# observeEvent(input[[paste0("addSub_",1)]],{
# alld$ui[[1]][[length(alld$ui[[1]])+1]] <- paste0("addSub_",1)
# })
observeEvent(input$addSeg,{
lapply(1:length(alld$ui), function(i){
observeEvent(input[[paste0("addSub_",i)]],{
alld$ui[[i]][[length(alld$ui[[i]])+1]] <- HTML(paste0("<br>addSub_",i,"<br>"))
})
})
})
output$myUI <- renderUI({alld$ui})
output$txt <- renderText(class(alld$ui))
}
shinyApp(ui, server)
请帮助...
答案 0 :(得分:1)
一个非常有趣的问题,以及一个值得称赞的代表。我设法找到了解决方案。您可以使用以下命令替换服务器对象:
server <- function(input, output, session) {
alld <- reactiveValues()
alld$ui <- list()
# Action to add new Segment
observeEvent(input$addSeg,{
new_id <- length(alld$ui) + 1
sub_name <- paste0("addSub_", new_id)
alld$ui[[new_id]] <- list(
actionButton(sub_name, "Add a Sub Segment")
)
observeEvent(input[[sub_name]], {
new_text_id <- length(alld$ui[[new_id]]) + 1
alld$ui[[new_id]][[new_text_id]] <- HTML(paste0("<br>addSub<br>"))
})
})
output$myUI <- renderUI({alld$ui})
output$txt <- renderText({
capture.output(str(alld$ui))
})
}
让我们谈谈您的原始代码。您的第一个观察者工作正常。但是,第二个原因导致了不必要的行为。它返回一个新的观察者列表,该应用中当前每个addSub
按钮都一个。这意味着,在第一次单击时,它将创建addSub_1
的观察者,而在第二次单击时,它将返回addSub_1
和addSub_2
的观察者。但是,第一个addSub_1
观察者仍然存在。这意味着,当您单击addSub_1
时,有两个观察者在响应,并且文本显示两次。
我的解决方案是将您的两个观察员合并为一个。单击addSeg
时,将在UI列表中创建按钮,并创建处理该按钮的观察者。这样,就不会重复,并且该应用程序可以按预期运行。