0

我正在构建一个shiny应用程序,并且将在多个页面上具有相同的radio button输入,这将改变页面上显示的内容。我将这些单选按钮放在一个模块中,这样我就不必在多个地方重现该代码。它们都将具有一组静态的,但我希望它们在整个应用程序中choices都保持相同的值。selected这意味着每次更改页面时,都会选择与以前相同的值。如果我A在一个页面上选择,所有其他页面也将被A选中,直到我在任何其他页面上选择不同的选项。

到目前为止,我的任何尝试都没有运气。 这个解释似乎接近我正在寻找的东西,但我无法让它发挥作用。在下面的应用程序中,我觉得我应该能够向modServer函数传递一个反应值,该值会将关联更新radio buttons为相同的selected值。如果我可以根据input$tmp我认为我应该能够在模块的多次迭代中复制这个单一模块更新。

编辑:更新的代码。应用程序现在可以检查input$tmp将模块外部的值视为自身和反应值。也在模块内作为输入以及新的反应值。

新问题:为什么没有将这些变量显示为反应变量?这一定是为什么observeEventmodServer. 显示renderText这些值正在更新,但它没有触发updateRadioGroupButtons.

library(shiny)
library(shinyWidgets)

# UI module
modUI <- function(id){
  ns <- NS(id)
  tagList(
      shinyWidgets::radioGroupButtons(
        inputId = ns("radio"),
        choices = c('A', 'B', 'C', 'D'),
        selected = 'A'),
      uiOutput(ns('modtest')),
      uiOutput(ns('modtest2'))
  )

}
# Server module
modServer <- function(id, .selected){
  moduleServer( id, function(input, output, session){
    ns <- session$ns
  
    mod_rval <- reactive({ .selected() })    
        
    output$modtest <- renderText({
      paste('mod_rval() is:', mod_rval(), 'and is reactive: ', is.reactive(mod_rval()))
    })
    
    output$modtest2 <- renderText({
      paste('.selected() is:', .selected(), 'and is reactive: ', is.reactive(.selected()))
    })
    
    observeEvent(.selected(), {
      shinyWidgets::updateRadioGroupButtons(
        session,
        inputId = ns("radio"),
        choices = c('A', 'B', 'C', 'D'),
        selected = .selected()
      )
    })
  
  })
}

# APP
ui <- fluidPage(
  selectInput('tmp', 'tmp : input value', choices = c('A','B','C','D')),
  modUI(id='mod1'),
  uiOutput('test'),
  uiOutput('test2')
)

server <- function(input, output, session) {
  
  # functioning.
  rval <- reactive({input$tmp})
  modServer(id = 'mod1', .selected = rval)

  output$test <- renderText({
    paste('rval() is: ', rval(), 'and is reactive: ', is.reactive(rval()))
  })
  
  output$test2 <- renderText({
    paste('input$tmp is: ', input$tmp, 'and is reactive: ', is.reactive(input$tmp))
  })
  
}

shinyApp(ui, server)
4

1 回答 1

1

您不需要nsin updateRadioGroupButtons(...),并且您确实需要在不同的服务器模块中进行更新,因为一个会影响另一个。试试这个

library(shiny)
library(shinyWidgets)

# UI module
modUI <- function(id){
  ns <- NS(id)
  shinyWidgets::radioGroupButtons(
    inputId = ns("radio"),
    choices = c('A', 'B', 'OK', 'Whatever'),
    selected = 'A')
  
}
# Server module 1
modServe <- function(id){
  moduleServer( id, function(input, output, session){
    return(reactive(input$radio))
  })
}
# Server module 2
modServer <- function(id, selected){
  moduleServer( id, function(input, output, session){
    
    observe({
      print(selected())
      shinyWidgets::updateRadioGroupButtons(
        session,
        inputId = "radio",
        choices = c('A', 'B', 'C', 'D'),
        selected = selected()
      )
    })
    
  })
}

# APP
ui <- fluidPage(
  modUI(id='mod1'),
  modUI(id='mod2')
)

server <- function(input, output, session) {
  m1 <- modServe("mod1")
  m2 <- modServe("mod2")
  
  modServer("mod2",m1)
  modServer("mod1",m2)
}

shinyApp(ui, server)
于 2021-11-16T20:34:55.737 回答