R Shiny:在嵌套模块之间传递反应值

时间:2018-12-29 14:02:22

标签: module shiny

我正在尝试对闪亮的应用程序进行模块化,但是我面临在嵌套模块之间传递的反应堆值的问题。当我从外部模块调用内部模块时,(内部模块的)renderText不会使用新值(来自外部模块)进行更新。

here描述了类似的问题,但是我不知道该如何解决。我用一个简单的例子简化了我的问题。

这是没有模块的代码(可以正常工作):

ui <- fluidPage(
  textOutput('text'),
  actionButton('button', 'OK')
)

server <- function(input, output, session){
  output$text <- renderText({'blabla1'})
  observeEvent(input$button, {
    output$text <- renderText({'blabla2'})
  })
}

shinyApp(ui=ui, server=server)

这是带有模块的代码,该模块无法正常工作(因为未显示'blabla2')。我还添加了一些打印功能,以了解为什么未显示新链条。看来,当我从外部模块调用内部模块时,renderText不会重新运行。我猜想问题出在反应性价值上,但它也不起作用。

innerUI <- function(id){
  ns <- NS(id)
  textOutput(ns('text'))
}

outerUI <- function(id){
  ns <- NS(id)
  actionButton(ns('button'), 'OK')
}

inner <- function(input, output, session, chain){
  print('in inner function')
  output$text <- renderText({
    print('in output$text')
    chain()})
}

outer <- function(input, output, session){
  observeEvent(input$button, {
    print('in observeEvent')
    callModule(inner, 'test1', reactive('blabla2'))
  })
}

ui <- fluidPage(
  innerUI('test1'),
  outerUI('test2')
)

server <- function(input, output, session){
  callModule(inner, 'test1', reactive('blabla1'))
  callModule(outer, 'test2')
}

shinyApp(ui=ui, server=server)

在此先感谢您的帮助! :)

编辑

我终于找到了使用activeVal而不是active来解决此反应性问题的方法。我不确定这是最好的方法,但至少能奏效。 这是工作代码:

innerUI <- function(id){
  ns <- NS(id)
  textOutput(ns('text'))
}

outerUI <- function(id){
  ns <- NS(id)
  actionButton(ns('button'), 'OK')
}

inner <- function(input, output, session, chain){

  output$text <- renderText({
    chain()
  })
}

outer <- function(input, output, session, value){

  observeEvent(input$button, {
    value('blabla2') 
    callModule(inner, 'test1', value)
  })
}

ui <- fluidPage(
  innerUI('test1'),
  outerUI('test2')
)

server <- function(input, output, session){

  value <- reactiveVal('blabla1')

  callModule(inner, 'test1', value)
  callModule(outer, 'test2', value)

}

shinyApp(ui=ui, server=server)

0 个答案:

没有答案