R Shiny: передать реактивное значение между вложенными модулями - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь модулировать свое блестящее приложение, но сталкиваюсь с проблемой реактивного значения, передаваемого между вложенными модулями.Когда я вызываю мой внутренний модуль из моего внешнего модуля, 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...