在闪亮的服务器模块中创建时无法访问 radioButton 的值
Unable to access the value of radioButton when created inside a shiny server module
我的 shinyapp 是使用模块构建的,radioBox 组件 inputId = modelling_type
在服务器中创建,使用 renderUI 函数并存储在 outputId = modelling_type_ui
下
因为我正在使用模块,所以我在 mod_ui
中使用了 spaced 我的 ID,然后为了(尝试!)使用相同的名称 space mod_server
中的函数 我通过 ns <- parentsession$ns
调用了它。这不会引发错误。但我现在希望通过 input$modelling_type
访问 RadioBox 的值
这是行不通的!所以我一定是错误地调用了这个值。
代码如下:
library(shiny)
library(shinyalert)
library(shinydashboard)
library(shinyjs)
library(tidyverse)
# modules ------------------------------------------
mod_ui <- function(id){
ns <- NS(id)
fluidPage(
uiOutput(outputId = ns("modelling_type_ui")),
textOutput(outputId = ns("capture"))
)
}
mod_server <- function(id, parentsession){
moduleServer(id,
function(input, output, server){
ns <- parentsession$ns
output$modelling_type_ui = renderUI({
print(input$modelling_type) # this should not be null
radioButtons(
inputId = ns("modelling_type"),
label = "Choose a modelling technique",
choices = c("OLS",
"Bayesian"),
selected = "OLS")
})
output$capture = renderText({ paste0("modelling type selected:", input$modelling_type) })
})
}
# call app ---------------------------------------
# run app
ui <- function(){ mod_ui("mt") }
server <- function(input, output, session){ mod_server("mt", session) }
shinyApp(ui = ui, server = server)
感谢任何帮助。通常我只会在 UI 中调用 radioButtons,并在服务器中使用 updateradioButtons 函数,但我正在处理重复使用以下方法的旧版应用程序。
为了扩展我上面的评论,这里有一个 MWE,我相信它可以满足您的需求。
我不确定你为什么要使用 uiOutput
和 renderUI
。我假设在您的实际用例中需要它,但这里不需要。此外,没有必要搞砸 parentsession
之类的东西。
调试打印输出 NULL
的一个原因是您在尝试打印其值时尚未定义无线电组。
library(shiny)
library(tidyverse)
mod_ui <- function(id){
ns <- NS(id)
fluidPage(
uiOutput(outputId = ns("modelling_type_ui")),
textOutput(outputId = ns("capture"))
)
}
mod_server <- function(id) {
moduleServer(
id,
function(input, output, session){
ns <- session$ns
output$modelling_type_ui = renderUI({
radioButtons(
inputId = ns("modelling_type"),
label = "Choose a modelling technique",
choices = c("OLS","Bayesian"),
selected = "OLS"
)
})
output$capture <- renderText({
paste0("modelling type selected: ", input$modelling_type)
})
rv <- reactive({
input$modelling_type
})
return(rv)
}
)
}
ui <- function() {
fluidPage(
mod_ui("mt"),
textOutput("returnValue")
)
}
server <- function(input, output, session) {
modValue <- mod_server("mt")
output$returnValue <- renderText({
paste0("The value returned by the module is ", modValue())
})
}
shinyApp(ui = ui, server = server)
我的 shinyapp 是使用模块构建的,radioBox 组件 inputId = modelling_type
在服务器中创建,使用 renderUI 函数并存储在 outputId = modelling_type_ui
因为我正在使用模块,所以我在 mod_ui
中使用了 spaced 我的 ID,然后为了(尝试!)使用相同的名称 space mod_server
中的函数 我通过 ns <- parentsession$ns
调用了它。这不会引发错误。但我现在希望通过 input$modelling_type
这是行不通的!所以我一定是错误地调用了这个值。
代码如下:
library(shiny)
library(shinyalert)
library(shinydashboard)
library(shinyjs)
library(tidyverse)
# modules ------------------------------------------
mod_ui <- function(id){
ns <- NS(id)
fluidPage(
uiOutput(outputId = ns("modelling_type_ui")),
textOutput(outputId = ns("capture"))
)
}
mod_server <- function(id, parentsession){
moduleServer(id,
function(input, output, server){
ns <- parentsession$ns
output$modelling_type_ui = renderUI({
print(input$modelling_type) # this should not be null
radioButtons(
inputId = ns("modelling_type"),
label = "Choose a modelling technique",
choices = c("OLS",
"Bayesian"),
selected = "OLS")
})
output$capture = renderText({ paste0("modelling type selected:", input$modelling_type) })
})
}
# call app ---------------------------------------
# run app
ui <- function(){ mod_ui("mt") }
server <- function(input, output, session){ mod_server("mt", session) }
shinyApp(ui = ui, server = server)
感谢任何帮助。通常我只会在 UI 中调用 radioButtons,并在服务器中使用 updateradioButtons 函数,但我正在处理重复使用以下方法的旧版应用程序。
为了扩展我上面的评论,这里有一个 MWE,我相信它可以满足您的需求。
我不确定你为什么要使用 uiOutput
和 renderUI
。我假设在您的实际用例中需要它,但这里不需要。此外,没有必要搞砸 parentsession
之类的东西。
调试打印输出 NULL
的一个原因是您在尝试打印其值时尚未定义无线电组。
library(shiny)
library(tidyverse)
mod_ui <- function(id){
ns <- NS(id)
fluidPage(
uiOutput(outputId = ns("modelling_type_ui")),
textOutput(outputId = ns("capture"))
)
}
mod_server <- function(id) {
moduleServer(
id,
function(input, output, session){
ns <- session$ns
output$modelling_type_ui = renderUI({
radioButtons(
inputId = ns("modelling_type"),
label = "Choose a modelling technique",
choices = c("OLS","Bayesian"),
selected = "OLS"
)
})
output$capture <- renderText({
paste0("modelling type selected: ", input$modelling_type)
})
rv <- reactive({
input$modelling_type
})
return(rv)
}
)
}
ui <- function() {
fluidPage(
mod_ui("mt"),
textOutput("returnValue")
)
}
server <- function(input, output, session) {
modValue <- mod_server("mt")
output$returnValue <- renderText({
paste0("The value returned by the module is ", modValue())
})
}
shinyApp(ui = ui, server = server)