将 Shiny Modules 中的数据从 Module 1 传递到 Module 2

Posted

技术标签:

【中文标题】将 Shiny Modules 中的数据从 Module 1 传递到 Module 2【英文标题】:Passing data within Shiny Modules from Module 1 to Module 2 【发布时间】:2018-03-15 06:51:58 【问题描述】:

我没有可重现的示例,因为问题更多是关于模块如何工作的。我试图了解如何将一些反应功能从一个模块传递到下一个模块。过去我收到过关于使用 ObserveEvent 的回复,但是当我在一个模块中使用响应式值在另一个模块中执行其他操作时,它们似乎不起作用

module1 <- function(input, output, session)

data1<-reactive(
  #some reacttive funcion that produces an output

)
data2<-reactive(
  #some reacttive funcion that produces another output

)  



return(list(data1,data2))


  

module2 <- function(input, output, session,data1)

observe( data1(), 

  #perform some other functions here using data1().e.g reading or parsing data
)



所以基本上我有一个 module1 从 data1 和 data2 返回两个输出

我想在模块 2 中使用 data1 的值并使用该值执行一些新操作。

我在这里查看了类似问题的其他答案,但我仍然不明白。如果有人可以帮助我更清楚地解释这个概念,那将有很大帮助 感谢您的帮助

【问题讨论】:

【参考方案1】:

一种可能性是在构建时将输出从一个模块传递到另一个模块。这允许模块之间的层次关系。还有可能创建两个模块之间共享的内存,我不会在这个答案中介绍。

reactiveValues

在这里我创建了一个inputModule 和一个outputModuleinputModule 接收用户的两个文本输入,输出模块通过verbatimTextOutput 显示它们。 inputModule 将用户提交的数据作为reactiveValues 对象传递给输出模块,称为ImProxy(输入模块代理)。 outputModule 像列表一样访问数据(ImProxy$text1ImProxy$text2)。

library(shiny)

inputModuleUI <- function(id)
  ns <- NS(id)
  wellPanel(h3("Input Module"),
            textInput(ns('text1'), "First text"),
            textInput(ns('text2'), "Second text"))

inputModule <- function(input, output, session)
  vals <- reactiveValues()
  observe(vals$text1 <- input$text1)
  observe(vals$text2 <- input$text2)
  return(vals)


outputModuleUI <- function(id)
  wellPanel(h3("Output Module"),
            verbatimTextOutput(NS(id, "txt")))

outputModule <- function(input, output, session, ImProxy)
  output$txt <- renderPrint(
    paste(ImProxy$text1, "&", ImProxy$text2)
  )


ui <- fluidPage(
  inputModuleUI('IM'),
  outputModuleUI('OM')
)   
server <- function(input, output, session)
  MyImProxy <- callModule(inputModule, 'IM')
  callModule(outputModule, 'OM', MyImProxy)


shinyApp(ui, server)

这种方法也可以与observeobserveEvent 一起使用。

列表(反应)

如果你想使用reactive而不是reactiveValues,可以使用上面代码的以下改编。您可以保留 ui 函数原样。

inputModule <- function(input, output, session)
  list(
    text1 = reactive(input$text1),
    text2 = reactive(input$text2)
  )


outputModule <- function(input, output, session, ImProxy)
  output$txt <- renderPrint(
    paste(ImProxy$text1(), "&", ImProxy$text2())
  )


shinyApp(ui, server)

反应式(列表)

同样,这将为应用提供相同的功能,但代理模式略有不同。

inputModule <- function(input, output, session)
  reactive(
    list(
      text1 = input$text1,
      text2 = input$text2
    )
  )


outputModule <- function(input, output, session, ImProxy)
  output$txt <- renderPrint(
    paste(ImProxy()$text1, "&", ImProxy()$text2)
  )


shinyApp(ui, server)

【讨论】:

我通过修改此代码提出了一个问题 - 您可以看一下吗?非常感谢..here @Gregor de Cillia,每个输入是否需要 1 个观察或观察事件,我们可以将所有输入都列在 1 个中吗?

以上是关于将 Shiny Modules 中的数据从 Module 1 传递到 Module 2的主要内容,如果未能解决你的问题,请参考以下文章

将 SQL 输入日期范围传递给 SHINY 中的查询

如何从 Shiny 中的下拉框中根据变量选择动态创建直方图

您如何计算从 Shiny 中的 textInput 框中获取的数据?

将反应输入传递到 R Shiny 中的绘图轴

从 R Shiny 中的选定输入中过滤

在 Shiny 中将数据从 rhandsontable 对象转换为数据框