【问题标题】:How to access reactive value in parent module?如何访问父模块中的反应值?
【发布时间】:2021-07-17 03:52:27
【问题描述】:

我想要实现的是访问从子模块传递给父模块的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 感谢您的回答。事实上,在我的真实应用程序中,我需要向父模块返回多个反应值。下面是稍微更改的代码 - 我在 mod_ui_btn 中添加了第二个按钮 - 现在我需要将两个按钮的值返回到 server 模块。我列出了reactives,但无法使用observeoutput$example &lt;- 访问它们:

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)) 将多个 ractive 值返回给其他模块,然后在父模块中使用它们的名称捕获。即使我使用观察,它也不起作用。没有返回值。

【问题讨论】:

标签: r shiny reactive


【解决方案1】:

您可以使用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)

【讨论】:

  • 补充:因为mod_server_btn返回的value是一个反应变量,它应该在反应上下文中调用(observereactive等)。
  • 好的,还有一个问题——如何在reactive 上下文中调用它?我试图在serve 模块中捕获value()btn &lt;- reactive({ value() }) print(btn())。不幸的是,我收到了一个错误:Operation not allowed without an active reactive context
  • 正如@rbasa 在他的评论中所说,您只能在活动的反应上下文中调用反应变量(value()input$myvar 等),例如observe(...)、@987654337 @、output$myout &lt;- renderXXX(...)reactive(...) 等。要在控制台上打印它,请在 observer 中调用,就像我在代码中所做的那样。我不确定你为什么要定义btn &lt;- reactive({ value() }),因为value() 是反应式的。
  • 好的,谢谢。最后一个 - 我需要向父模块返回多个反应值。这就是它在我的真实应用程序中的工作方式。所以我在list 中返回它们,然后在observe 中捕获,但它不起作用。我在我的第一篇文章中添加了 EDIT 示例,请您看一下
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 2019-12-29
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多