我正在尝试对闪亮的应用程序进行模块化,但是我面临在嵌套模块之间传递的反应堆值的问题。当我从外部模块调用内部模块时,(内部模块的)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)