如何在 Shiny 中使用从主文件到模块文件的输入值

How to use inputs values from main file to module file in Shiny

提问人:JohnBones JohnBones 提问时间:1/21/2023 更新时间:1/21/2023 访问量:41

问:

我正在改进和改变我的问题。

此代码执行以下操作

一旦我点击链接的名称,它的名字就会从模块发送到 h1 标签内的模块显示:

这是我的模块代码:

example_UI <- function(id) {
      ns <- NS(id)
      tagList(    
        htmlOutput(ns('name_from_main'))    
      )
    }

example_Server <- function(id, names) {
      moduleServer(
        id,
        function(input, output, session) {

          output$name_from_main <- renderUI({    
            h1(names())    
          })    
        }
      )
    }

我的主要应用程序代码是这样的:

ui <- fluidPage(
      names(mtcars)[1:4] %>% map(~ actionLink(label = paste0(.x),
                                         inputId = paste0(.x))),
    example_UI('example')
)

server <- function(input, output, session) {

  object <- reactive({
            if(input$mpg != 0){

              "MPG"

            }else{
              if(input$hp != 0){

                "HP"

              }else{
                if(input$cyl != 0){
                  "cyl"

                }else{
                    "others"
                }
              }
            }
    })

      example_Server("example", names = object )

}

shinyApp(ui, server)

我的问题是它不完整。一旦我点击链接,它就会第一次改变。并且不显示其他链接名称 波纹 管。

我认为问题出在对象变量上。

有什么帮助吗?

r 闪亮

评论

0赞 Limey 1/21/2023
鉴于这是您在 12 小时内发布的问题的第三次迭代,并且删除了前两个版本,我当然不会花任何精力来回答它。您已经获得了所需的信息。不止一次。

答:

2赞 jpdugo17 1/21/2023 #1

名称仅更新一次的原因与以下事实有关:只要按下一次 mpg 链接,该输入的关联值将在应用程序生命周期的剩余时间内变为零。

缓解这种情况的一种方法是为每个链接设置一个观察者,并使用单个 reactiveVal 来存储最后一个按下的链接的信息。

server <- function(input, output, session) {
  
  name <- reactiveVal("OTHERS")
  
  observeEvent(input$mpg, {
    name("MPG")
  })
  
  observeEvent(input$cyl, {
    name("CYL")
  })
  
  observeEvent(input$disp, {
    name("DISP")
  })
  
  observeEvent(input$hp, {
    name("HP")
  })
  
  # pass reactiveVal as the names argument
  example_Server("example", names = name)
}

另一种选择是使用另一种输入来更轻松地捕获不同的值。在这种情况下,input$name 将包含从输入中最后选择的值。

ui <- fluidPage(
  shinyWidgets::radioGroupButtons(
    inputId    = "name",
    label      = "",
    choices    = names(mtcars)[1:4],
    status     = "primary",
    individual = TRUE
  ),
  example_UI("example")
)

server <- function(input, output, session) {
  example_Server(
    id    = "example",
    names = reactive(toupper(input$name))
  )
}

shinyApp(ui, server)