有两个问题需要解决:
- 你的正则表达式
|c
caught input$changed
- 你需要使用
isolate(names(input))
在事件表达式内,否则观察者将因事件的每次变化而触发names(input)
-
Edit: use
isolate({input$changed})
- 查看注释(使用时不需要reactiveVal()
)
ui <- fluidPage(
tags$head(
tags$script(
"$(document).on('shiny:inputchanged', function(event) {
if (event.name != 'changed') {
Shiny.setInputValue('changed', event.name);
}
});"
)
),
numericInput("a_1", "a_1", 0),
textInput("a_2", "a_2"),
textInput("c", "c"),
textInput("d", "d"),
p("changedInputs:"), textOutput("changedInputs"), br(),
p("aFired:"), textOutput("aFired")
)
server <- function(input, output, session) {
output$changedInputs <- renderText({
paste("Outside observer: Latest input fired:", paste(input$changed, collapse = ", "))
})
observeEvent(eventExpr = {
lapply(grep(pattern = "^a_+[[:digit:]]$|^c$", x = isolate({names(input)}), value = TRUE), function(x){input[[x]]})
}, handlerExpr = {
req(input$changed)
if (input$changed == "a_1") {
output$aFired <- renderText("Inside observer: input$a_1 was fired")
} else if (input$changed == "a_2") {
output$aFired <- renderText("Inside observer: input$a_2 was fired")
} else {
output$aFired <- renderText({paste("Inside observer:", isolate({input$changed}), "was fired")})
}
}, ignoreInit = TRUE)
}
shinyApp(ui, server)
另一个编辑:现在我记得在哪里isolate({input$changed})
迷路了(我确信它在我的测试期间有效......)最初我怀疑renderText()
嵌套在观察者内部可能会导致问题,因此我实现了一个reactiveVal()
打印输出。该解决方案无需isolate({input$changed})
:
ui <- fluidPage(
tags$head(
tags$script(
"$(document).on('shiny:inputchanged', function(event) {
if (event.name != 'changed') {
Shiny.setInputValue('changed', event.name);
}
});"
)
),
numericInput("a_1", "a_1", 0),
textInput("a_2", "a_2"),
textInput("c", "c"),
textInput("d", "d"),
p("changedInputs:"), textOutput("changedInputs"), br(),
p("aFired:"), textOutput("aFired")
)
server <- function(input, output, session) {
output$changedInputs <- renderText({
paste("Outside observer: Latest input fired:", paste(input$changed, collapse = ", "))
})
myText <- reactiveVal()
observeEvent(eventExpr = {
lapply(grep(pattern = "^a_+[[:digit:]]$|^c$", x = isolate({names(input)}), value = TRUE), function(x){input[[x]]})
}, handlerExpr = {
req(input$changed)
if (input$changed == "a_1") {
myText("Inside observer: input$a_1 was fired")
} else if (input$changed == "a_2") {
myText("Inside observer: input$a_2 was fired")
} else {
myText(paste("Inside observer:", input$changed, "was fired"))
}
}, ignoreInit = TRUE)
output$aFired <- renderText({myText()})
}
shinyApp(ui, server)
在发现实际问题之后并在此处发布我的答案之前,我恢复到了没有的版本reactiveVal()
(因为它更接近你的问题)并忘记了isolate
。因此,您首先收到的是两个版本的混合版本。