Я пытаюсь модулировать свое блестящее приложение, но сталкиваюсь с проблемой реактивного значения, передаваемого между вложенными модулями.Когда я вызываю мой внутренний модуль из моего внешнего модуля, renderText (внутреннего модуля) не обновляется новым значением (из внешнего модуля).
Подобная проблема была описана здесь , но я не могу понять, как ее решить.Я упростил мою проблему на простом примере.
Вот код без модуля (работает отлично):
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)
Заранее спасибо за вашу помощь !!:)
РЕДАКТИРОВАТЬ
Я наконец-то выяснил, как решить эту проблему реактивности, используя реактивный Val вместо реактивного.Я не уверен, что это был лучший способ, но по крайней мере это работает.Вот рабочий код:
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)