将闪亮模块内的数据从模块1传递到模块2 [英] Passing data within Shiny Modules from Module 1 to Module 2

查看:15
本文介绍了将闪亮模块内的数据从模块1传递到模块2的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我没有可重复使用的示例,因为问题更多的是模块如何工作。我正在尝试理解如何将一些反应函数从一个模块传递到下一个模块。我过去收到过有关使用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
})


}

所以基本上我有一个模块1,它从data1和data2返回两个输出

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

我在这里查看了类似问题的其他答案,但我仍然不理解它们。如果有人能帮我更清楚地解释这个概念,那就大有裨益了 感谢您的帮助

推荐答案

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

reactiveValues

这里我创建了一个inputModule和一个outputModuleinputModule接收用户输入的两个文本,输出模块通过verbatimTextOutput显示。inputModule将用户提交的数据作为名为ImProxy(输入模块代理)的reactiveValues对象传递给输出模块。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)

这篇关于将闪亮模块内的数据从模块1传递到模块2的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆