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)
-----------------------------------