以前的动态输入在被新的替换时不会消失

问题描述 投票:0回答:1

我制作了一个闪亮的应用程序,用户可以从三个系列的单词中进行选择。当用户选择系列1时,用户可以从“a”、“b”、“c”和“d”中选择。当用户选择系列2时,用户可以从'e'、'f'、'g'、'h'和'i'等中选择。代码如下:

library(shiny)

ui <- fluidPage(selectInput('replyWord', 'Word:', choices = 1:3, selected = "", selectize=FALSE, size=3), uiOutput("showWord"))

server <- function(input, output, session)
{
  global <- reactiveValues(words=c())

  shinyInputId <- function(prefix, id) 
  {
    paste(prefix, id, sep = "_")
  }

  output$showWord <- renderUI(
  {
    req(input$replyWord, global$words)

    lapply(seq(length(global$words)), function(i) 
      uiOutput(shinyInputId("button", i))
    )
  })

  observeEvent(input$replyWord, 
  {
    req(input$replyWord)

    if (input$replyWord==1) global$words <- c("a", "b", "c", "d")
    if (input$replyWord==2) global$words <- c("e", "f", "g", "h", "i")
    if (input$replyWord==3) global$words <- c("j", "k", "l")

    lapply(seq(length(global$words)), function(i) 
    {
      Name <- global$words[i]
      gen.input <- shinyInputId("button", i)

      output[[gen.input]] <- renderUI(
      {
        actionButton(inputId = gen.input, label = Name)
      })
    
      observeEvent(input[[gen.input]], 
      {
        print(paste("You clicked", Name))
      })
    })
  })
}

shinyApp(ui = ui, server = server)

此代码的灵感来自于https://gist.github.com/strboul/310dc3d546437f40429e7a837f1de07c

每次选择一个单词时,控制台中都会出现一条消息,并且在消息中提到选择了哪个单词。

但是,从系列 1 中选择一个单词并切换到系列 2 后,从系列 1 中选择的单词仍然保留,并且在从系列 2 中选择单词时,说出第二个单词“f”,即系列 1 的第二个单词控制台中也提到了“b”,这不是我想要的。

不知何故,看起来我是否需要在切换到另一个系列时明确删除一个系列的选择,但我不知道如何做。有什么想法吗?

r shiny dynamic
1个回答
0
投票

尝试定义唯一的 ID。在当前设置中,您使用

button_1
作为 ID 来表示系列 1 中的“a”、系列 2 中的“e”和系列 3 中的“j”。您可以通过将
input$replyWord
添加到 ID 来使它们唯一。试试这个

library(shiny)

ui <- fluidPage(selectInput('replyWord', 'Word:', choices = 1:3, selected = "", selectize=FALSE, size=3), uiOutput("showWord"))

server <- function(input, output, session)
{
  global <- reactiveValues(words=c())
  
  shinyInputId <- function(word,prefix, id) 
  {
    paste(word, prefix, id, sep = "_")
  }
  
  output$showWord <- renderUI(
    {
      req(input$replyWord, global$words)
      
      lapply(seq(length(global$words)), function(i) 
        uiOutput(shinyInputId(input$replyWord,"button", i))
      )
    })
  
  observeEvent(input$replyWord, 
               {
                 req(input$replyWord)
                 
                 if (input$replyWord==1) global$words <- c("a", "b", "c", "d")
                 if (input$replyWord==2) global$words <- c("e", "f", "g", "h", "i")
                 if (input$replyWord==3) global$words <- c("j", "k", "l")
                 
                 lapply(seq(length(global$words)), function(i) 
                 {
                   Name <- global$words[i]
                   gen.input <- shinyInputId(input$replyWord,"button", i)
                   
                   output[[gen.input]] <- renderUI(
                     {
                       actionButton(inputId = gen.input, label = Name)
                     })
                   
                   observeEvent(input[[gen.input]], 
                                {
                                  print(paste("You clicked", Name))
                                })
                 })
               })
}

shinyApp(ui = ui, server = server)
© www.soinside.com 2019 - 2024. All rights reserved.