将 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
和一个outputModule
。 inputModule
接收用户的两个文本输入,输出模块通过verbatimTextOutput
显示它们。 inputModule
将用户提交的数据作为reactiveValues
对象传递给输出模块,称为ImProxy
(输入模块代理)。 outputModule
像列表一样访问数据(ImProxy$text1
、ImProxy$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)
这种方法也可以与observe
或observeEvent
一起使用。
列表(反应)
如果你想使用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的主要内容,如果未能解决你的问题,请参考以下文章