在 Shiny/R 中,如何使用从一个模块到另一个模块的输入?

In Shiny/R how to use input from one module into other module?

提问人:JohnBones JohnBones 提问时间:12/7/2022 最后编辑:JohnBones JohnBones 更新时间:12/8/2022 访问量:567

问:

我需要从 selectInput 中选择一个名称后,此名称将在 mod1_UI 模块上使用。到目前为止,我就是这样做的:

这是我的模块文件:

mod1_UI <- function(id) {
  ns <- NS(id)
  tagList(h1(uiOutput(ns('titulo_select'))))
}

mod1_Server <- function(id, ui) {
  moduleServer(id,
               function(input, output, session) {
                 output$titulo_select <- renderUI({
                   ui
                 })

               })
}

这是我的应用程序:

library(shiny)

ui <- fluidPage(selectInput(
  inputId = 'choices',
  label = 'Choices',
  choices = c('One Title', 'Second Title')
),

#verbatimTextOutput('verbatim'),

mod1_UI('titulo'))

server <- function(input, output, session) {
  choices <- reactive({
    input$choices
  })

 # output$verbatim <- renderText({
 #   choices()
 #})

  mod1_Server("titulo", ui = choices())

}

shinyApp(ui, server)

正如你所看到的,没有反应性,我改变了选择选项。它只显示了第一个选项。

我排除了 verbatimOutput 以表明它在 ui 内部是反应式的,但是当我考虑该模块时,它不是。

r 闪亮

评论

0赞 YBS 12/7/2022
在服务器端丢失。mod1_Server("titulo")
0赞 JohnBones JohnBones 12/7/2022
@YBS感谢您抽出时间,但它不起作用。它仅显示选择的第一个选项。不是第二个。我
0赞 JohnBones JohnBones 12/7/2022
@YBS 我用你的劝说来回答这个问题。但是当我更改selectInput时,仍然没有更改输入选项
0赞 Stéphane Laurent 12/8/2022
您必须传递给模块,而不是 .然后你必须在模块中做。ui=choicesui=choices()ui()

答:

1赞 YBS 12/8/2022 #1

也许你正在寻找这个。

mod1_UI <- function(id) {
  ns <- NS(id)
  tagList(
    selectInput(
      inputId = ns('choices'),
      label = 'Choices',
      choices = c('One Title', 'Second Title')
      ),
    uiOutput(ns('titulo_select'))
    )
}

mod1_Server <- function(id) {
  moduleServer(id,
               function(input, output, session) {
                 
                 choices <- reactive({
                   input$choices
                 })
                 output$titulo_select <- renderUI({
                   choices()
                 })
                 
               })
}

library(shiny)

ui <- fluidPage(
  mod1_UI('titulo')
)

server <- function(input, output, session) {
  mod1_Server("titulo")
}

shinyApp(ui, server)

评论

0赞 JohnBones JohnBones 12/8/2022
差不多就是这样。select 输入应保留在应用代码中。这个想法是,一旦我更改了选择输入,更改就会发生在模块上
0赞 YBS 12/8/2022
在这种情况下,您可以使用 @Stephane Laurent 的答案。
2赞 Stéphane Laurent 12/8/2022 #2

你必须将电抗导体传递给模块,也就是说不要把括号放进去:

mod1_Server("titulo", ui = choices)

然后在模块中,您必须使用括号:.ui()