[英]R shiny observeEvent not working in function in module
预先感谢您的帮助。 我试图将问题归结为尽可能简单的应用程序。 我有一个函数sliderResetInput,它调用observeEvent并返回一些UI元素。 我可以在模块外部使用sliderResetInput(将在下面进行演示),但是不能在模块内部使用它。 我认为这是在输入周围包裹名称空间的问题,但我认为ID都在这里签出。 这是怎么回事? 值得注意的是,虽然此应用程序的构建看起来不必要地复杂,但是我需要一个更大的应用程序的结构。
这有效:
library(shiny) # Version 1.0.5
sliderResetInput = function(id, input, output, session) {
observeEvent(input[[paste0(id, "_reset_slider")]],
updateSliderInput(session = session, inputId = paste0(id, "_slider"), value = c(0, 10)))
out = list(
sliderInput(inputId = paste0(id, "_slider"), label = "Slider", min = 0, max = 10, value = c(0, 10)),
actionButton(inputId = paste0(id, "_reset_slider"), label = "Reset slider")
)
return(out)
}
server <- function(input, output, session) {
getSliders = reactive(sliderResetInput(id = "test1", input, output, session))
output$sliders = renderUI(getSliders())
observeEvent(input$browser, browser())
}
ui <- fluidPage(
uiOutput(outputId = "sliders"),
actionButton(inputId = "browser", "Click me to go into browser()")
)
shinyApp(ui = ui, server = server, options = list(launch.browser = T))
使用相同的sliderResetInput()函数,此操作将无效:
library(shiny) # Version 1.0.5
sliderResetInput = function(id, input, output, session) {
observeEvent(input[[paste0(id, "_reset_slider")]],
updateSliderInput(session = session, inputId = paste0(id, "_slider"), value = c(0, 10)))
out = list(
sliderInput(inputId = paste0(id, "_slider"), label = "Slider", min = 0, max = 10, value = c(0, 10)),
actionButton(inputId = paste0(id, "_reset_slider"), label = "Reset slider")
)
return(out)
}
myModuleUI = function(id) {
ns = NS(id)
tagList(
uiOutput(outputId = ns("sliders"))
)
}
myModule = function(input, output, session) {
ns = session$ns
getSliders = reactive(sliderResetInput(id = ns("test1"), input, output, session))
output$sliders = renderUI(getSliders())
}
server <- function(input, output, session) {
callModule(myModule, id = "A")
observeEvent(input$browser, browser())
}
ui <- fluidPage(
myModuleUI(id = "A"),
actionButton(inputId = "browser", "Click me to go into browser()")
)
shinyApp(ui = ui, server = server, options = list(launch.browser = T))
有人知道这是怎么回事吗?
感谢您的时间!
您只需在窗口小部件的ID前面添加前缀。 那是:
sliderResetInput = function(id, NSid, input, output, session) {
observeEvent(input[[paste0(id, "_reset_slider")]], {
updateSliderInput(session = session, inputId = paste0(id, "_slider"), value = c(0, 10))
})
out = list(
sliderInput(inputId = paste0(NSid, "_slider"), label = "Slider", min = 0, max = 10, value = c(0, 10)),
actionButton(inputId = paste0(NSid, "_reset_slider"), label = "Reset slider")
)
return(out)
}
和
getSliders = reactive(sliderResetInput(id = "test1", NSid = ns("test1"), input, output, session))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.