[英]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
值作為自身和反應值。 同樣在模塊內作為輸入以及一個新的無功值。
新問題:為什么沒有將這些變量顯示為反應變量? 這一定是為什么observeEvent
在modServer
。 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)
您不需要ns
在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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.