繁体   English   中英

R闪亮的observeEvent在模块的功能中不起作用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM