簡體   English   中英

使用饋送到模塊的反應值更新單選按鈕,R Shiny

[英]Update Radio buttons using a Reactive Value fed to a Module, R Shiny

我正在構建一個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)

您不需要nsupdateRadioGroupButtons(...) ,並且您確實需要在不同的服務器功能中進行更新,因為一個正在影響另一個。 嘗試這個

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM