r - R Shiny モジュールが別のタブの入力値を更新しない

CorePress2024-05-09  4

R Shiny Module does not update input value on different tabs

同じ入力を多く使用するタブパネルで動作するアプリがあり、ユーザー データに応答するには renderUI を使用してレンダリングする必要があります。変調された入力がレンダリングされる最初のメニューを優先し、別のパネルで行われた変更を無視していることに気付きました。

以下は、基本的な問題の簡略化された実際の例です。

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 に戻る必要があります。

2 つの異なるタブで同じレンダリングされた入力を変更し、最後の変更が保持されるようにする方法はありますか?



-----------------------------------

同じ ID で 2 つの数値入力を定義することはできないと思います。これが、メニュー 2 ページからの入力が使用されない理由です。別の ID を与えることで、それを使用するロジックを作成できます。

-----

@YBS がすでに述べたように、同じ ID で 2 つの入力を定義することはできません。 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)


-----------------------------------

Your guide to a better future - quark24
Your guide to a better future - quark24