我制作了一个闪亮的应用程序,用户可以从三个系列的单词中进行选择。当用户选择系列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”,这不是我想要的。
不知何故,看起来我是否需要在切换到另一个系列时明确删除一个系列的选择,但我不知道如何做。有什么想法吗?
尝试定义唯一的 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)