如何访问父模块中的反应值?

How to access reactive value in parent module?

我想要实现的是访问从子模块传递给父模块的 reactive 值。下面的可重现示例展示了这个想法。当我单击 mod_server_btn 中的按钮时,它的值应该在控制台中打印出来(从父模块中):

library(shiny)
mod_ui_btn <-  function(id, label = "ui1UI") {
    ns <- NS(id)
    shinyUI(fluidPage(
        actionButton(ns("confirm"), "Submit", class='btn-primary')
    ))
}

mod_server_btn <- function(input, output, session) {   
    cond <- reactive({ input$confirm})
    return(cond)    
}

ui =fluidPage(
    mod_ui_btn("test"),
    uiOutput("example")
)

server=shinyServer(function(input, output, session) {   
    value <- callModule(mod_server_btn,"test")
    print(value)
    #print(value$cond) # these 3 don't work either
    #print(value()$cond)
    #print(value())  
})

shinyApp(ui=ui,server=server)

然而,它不起作用。当我单击按钮时,我在控制台中收到一条文本:reactive({input$confirm}),这不是我想要的,我需要访问按钮值。一般问题是 - 是否有可能访问父模块中的反应值?

编辑: @rbasa,@YBS 感谢您的回答。事实上,在我的真实应用程序中,我需要 return 多个父模块的反应值。下面是稍微更改的代码 - 我在 mod_ui_btn 中添加了第二个按钮 - 现在我需要将两个按钮的 return 值传递给 server 模块。我列出了 reactives 但无法使用 observeoutput$example <-:

访问它们
library(shiny)
mod_ui_btn <-  function(id, label = "ui1UI") {
    ns <- NS(id)
    shinyUI(fluidPage(
        actionButton(ns("confirm"), "Submit", class='btn-primary'),
        actionButton(ns("confirm2"), "Submit2", class='btn-primary')
    ))
}

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

    return(
        list(
            cond = reactive({ input$confirm}),
            cond2 = reactive({ input$confirm2})
        )
    )   
}

ui =fluidPage(
    mod_ui_btn("test"),
    verbatimTextOutput("example"),
    verbatimTextOutput("example2")
)

server=shinyServer(function(input, output, session) {   
    value <- callModule(mod_server_btn,"test")  
    output$example <- renderPrint(value$cond)
    output$example2 <- renderPrint(value$cond2)
    
    observe({
        print(value$cond)  #this is how I usually catch reactives - by their name
        print(value$cond2)
    })
})

shinyApp(ui=ui,server=server)

我通常对其他模块使用 return(list(..some reactive values)) 到 return 多个 ractive 值,然后在父模块中使用它们的名称。在这里即使我使用观察它也不起作用。 return 没有值。

您可以使用 value() 访问。我建议将您的 mod_server_btn 更改为如下所示,并注意 server 中的调用。 编辑: 更新了多个变量。试试这个

library(shiny)
mod_ui_btn <-  function(id, label = "ui1UI") {
  ns <- NS(id)
  shinyUI(fluidPage(
    actionButton(ns("confirm"), "Submit", class='btn-primary'),
    actionButton(ns("confirm2"), "Submit2", class='btn-primary')
  ))
}

mod_server_btn <- function(id) {
  moduleServer(id, function(input, output, session) {
    return(
      list(
        cond = reactive(input$confirm),
        cond2 = reactive(input$confirm2)
      )
    )  
    
  })
}

ui =fluidPage(
  mod_ui_btn("test"),
  verbatimTextOutput("example"),
  verbatimTextOutput("example2")
)

server=shinyServer(function(input, output, session) {   
  # value <- callModule(mod_server_btn,"test")  
  value <- mod_server_btn("test")
  output$example <- renderPrint(value$cond())
  output$example2 <- renderPrint(value$cond2())
  
  observe({
    print(value$cond())  #this is how I usually catch reactives - by their name
    print(value$cond2())
  })
})

shinyApp(ui=ui,server=server)