如何访问父模块中的反应值?
How to access reactive value in parent module?
我想要实现的是访问从子模块传递给父模块的 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 感谢您的回答。事实上,在我的真实应用程序中,我需要 return 多个父模块的反应值。下面是稍微更改的代码 - 我在 mod_ui_btn
中添加了第二个按钮 - 现在我需要将两个按钮的 return 值传递给 server
模块。我列出了 reactives
但无法使用 observe
或 output$example <-
:
访问它们
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))
到 return 多个 ractive 值,然后在父模块中使用它们的名称。在这里即使我使用观察它也不起作用。 return 没有值。
您可以使用 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)
我想要实现的是访问从子模块传递给父模块的 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 感谢您的回答。事实上,在我的真实应用程序中,我需要 return 多个父模块的反应值。下面是稍微更改的代码 - 我在 mod_ui_btn
中添加了第二个按钮 - 现在我需要将两个按钮的 return 值传递给 server
模块。我列出了 reactives
但无法使用 observe
或 output$example <-
:
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))
到 return 多个 ractive 值,然后在父模块中使用它们的名称。在这里即使我使用观察它也不起作用。 return 没有值。
您可以使用 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)