【问题标题】:R Shiny Module does not update input value on different tabsR Shiny Module 不会更新不同选项卡上的输入值
【发布时间】:2020-07-14 05:06:42
【问题描述】:

我有一个应用程序可以与使用许多相同输入的选项卡面板一起使用,并且必须使用 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 才能这样做。

有没有办法能够在两个不同的选项卡上修改相同的渲染输入,其中最后一个修改是保留的?

【问题讨论】:

  • 我认为您不能定义两个具有相同 ID 的数字输入。这就是您从菜单 2 页面输入的内容未被使用的原因。通过给它一个不同的ID,你可以编写一个逻辑来使用它。

标签: r shiny reactive


【解决方案1】:

正如@YBS 已经提到的,您不能定义具有相同 id 的两个输入。当输入发生更改(触发)时,我会使用 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)

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 2016-08-05
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 2017-07-20
    • 2013-04-08
    相关资源
    最近更新 更多