在闪亮的服务器模块中创建时无法访问 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,我相信它可以满足您的需求。

我不确定你为什么要使用 uiOutputrenderUI。我假设在您的实际用例中需要它,但这里不需要。此外,没有必要搞砸 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)