我没有一个可重复的例子,因为问题更多的是模块如何工作。我试图了解如何将一些反应函数从一个模块传递到下一个模块。我过去收到过有关使用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的值,并使用该值执行一些新操作。
我在这里看了类似问题的其他答案,但我仍然不理解它们。如果有人能帮助我更清楚地解释这个概念,那将会有很大的帮助 谢谢你的帮助
答案 0 :(得分:19)
一种可能性是在构造时将输出从一个模块传递到另一个模块。这允许模块之间的层次关系。还有可能创建在两个模块之间共享的内存,我将不会在这个答案中介绍。
我在这里创建了inputModule
和outputModule
。 inputModule
收到用户的两个文本输入,输出模块通过verbatimTextOutput
显示它们。 inputModule
将用户提交的数据作为名为reactiveValues
的{{1}}对象(输入模块代理)传递给输出模块。 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)