我正在構建一個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)
uj5u.com熱心網友回復:
您不需要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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/358131.html
上一篇:R:如何使用ggplot2創建具有一半顏色和一半數字的熱圖?
下一篇:如何更改R中列的語法?
