gpt4 book ai didi

r - 如何在 Shiny 的情况下创建动态数量的observeEvent?

转载 作者:行者123 更新时间:2023-12-02 02:47:00 25 4
gpt4 key购买 nike

在这里,我试图复制我原来的问题。如果您单击“添加分割”,以下 Shiny 的代码将创建“子分割”按钮。

现在“添加子段”按钮应该在每次点击时给出一行文本。但是我注意到,它会在单击后创建(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)

请帮忙...

enter image description here

最佳答案

非常有趣的问题,以及非常值得称道的reprex。我设法找到了解决方案。你可以用这个替换你的服务器对象:

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-list 中创建,处理它的观察者也被创建。这样,就没有重复项,应用程序按预期工作。

关于r - 如何在 Shiny 的情况下创建动态数量的observeEvent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54238427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com