R Shiny Module не обновляет входное значение на разных вкладках - PullRequest
1 голос
/ 13 июля 2020

У меня есть приложение, которое работает с панелями вкладок, которые используют одни и те же входные данные, и его нужно отображать с помощью renderUI для ответа на пользовательские данные. Я заметил, что мои модулированные входы отдают приоритет первому меню, в котором они отображаются, и игнорируют изменения, сделанные на разных панелях

Ниже приведен упрощенный рабочий пример основной c проблемы

library(shiny)
addexButtons <- function(id, label = "ROCParam") {
    ns <- NS(id)
    uiOutput(ns("roccondicionals"), label = label)
    
}

numbmod <- function(input, output, session, ndata) {
    output$roccondicionals <- renderUI({
        tagList(numericInput('numb', 'Choose Num', value = 0,))
    })
}

ui <- fluidPage(navbarPage(
    'App',
    tabPanel(title = 'Menu 1',
             sidebarLayout(
                 sidebarPanel(addexButtons("counter1", "Adder")),
                 mainPanel(textOutput('sumtotal'))
             )),
    
    tabPanel(title = 'Menu 2',
             sidebarLayout(
                 sidebarPanel(addexButtons("counter2", "Multiplier"),),
                 mainPanel(textOutput('multiplytotal'))
             ))
    
))



server <- function(input, output) {
    callModule(numbmod, "counter1")
    callModule(numbmod, "counter2")
    
    output$sumtotal <-
        renderText(paste0('5 + ', input$numb, ' = ', input$numb + 5))
    
    output$multiplytotal <-
        renderText(paste0('5 x ', input$numb, ' = ', input$numb * 5))
}

shinyApp(ui = ui, server = server)

Если вы запустите этот пример, вы увидите, что при переходе в меню 2 значение сохраняет информацию, измененную в меню 1 (которое предназначено), однако, если я решу изменить это же значение на той же вкладке, я не смогу и для этого необходимо вернуться в Меню 1.

Есть ли способ изменить один и тот же визуализированный ввод на двух разных вкладках, где сохраняется последняя модификация?

1 Ответ

1 голос
/ 14 июля 2020

Как уже упоминалось в @YBS, вы не можете определить два входа с одним и тем же идентификатором. Я бы использовал updateNumericInput для автоматического обновления входов при изменении (срабатывании) входов.

library(shiny)
addexButtons <- function(id, label = "ROCParam") {
  ns <- NS(id)
  uiOutput(ns("roccondicionals"), label = label)    
  }

numbmod <- function(input, output, session, ndata, n) {
  output$roccondicionals <- renderUI({
    numericInput(paste0("numb",n), 'Choose Num', value = 0)
  })
}

ui <- fluidPage(navbarPage(
  'App', id = "App",
  tabPanel(title = 'Menu1',
           tab_id = "tab1",
           sidebarLayout(
             sidebarPanel(addexButtons("counter1", "Adder")),
             mainPanel(textOutput('sumtotal'))
           )),
  
  tabPanel(title = 'Menu2',
           tab_id = "tab2",
           sidebarLayout(
             sidebarPanel(addexButtons("counter2", "Multiplier"),),
             mainPanel(textOutput('multiplytotal'))
           ))
  
))



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

  observeEvent(input$numb1, {
  updateNumericInput(session, "numb2", value = input$numb1)
    updateNavbarPage(session,"App", "Menu2")
  })
  
  observeEvent(input$numb2, {
    updateNumericInput(session, "numb1", value = input$numb2)
    updateNavbarPage(session,"App", "Menu1")

  })
    
  callModule(numbmod, "counter1",n = 1)
  callModule(numbmod, "counter2",n = 2)
  output$sumtotal <-
    renderText(paste0('5 + ', input$numb1, ' = ', input$numb1 + 5))
  
  output$multiplytotal <-
    renderText(paste0('5 x ', input$numb2, ' = ', input$numb2 * 5))
}

shinyApp(ui = ui, server = server)
...