将绘图从闪亮模块中的 renderUI 内部传递到主服务器
Passing Plots from inside a renderUI in a Shiny Module to main Server
我想了解如何将信息从模块传递到 Shiny App 的主服务器。这是对我的实际代码的过度简化,所以我知道它可以用不同的方式完成,但我需要主要用 server.R 文件中的 callModule
来完成。
# Mod1.R File
modUI <- function(id) {
ns <- NS(id)
tagList(
fluidRow(
column(
width = 12,
numericInput(ns("num"), "Choose a number to plot", value = 3),
uiOutput(ns("bins"))
)
)
)
}
modServer <- function(input, output, session) {
ns <- session$ns
output$bins <- renderUI(
ns <- session$ns,
selectInput(ns("plot_type"), "select plot", c("hist", "plot")),
plotOutput(ns("plott"))
)
output$plott <- renderPlot(
if (input$plot_type == "hist"){
hist(input$num)
} else (
plot(input$num)
)
)
}
##############
# App.R File
library(shiny)
library(tidyverse)
# Modules
source("mod1.R")
# Main App ----------------------------------------------------------------
ui <- fluidPage(
modUI("ssss")
) # Fluid Page
server <- function(input, output, session) {
callModule(modServer, "ssss")
}
shinyApp(ui, server)
我正在尝试 return 应该在 Mod1.R 文件中生成的绘图到服务器函数中的 App.R 文件,但我不太确定如何去做这个。我知道我应该在 Mod1.R 文件中 return 一个反应性输出,例如:return(reactive(output$plott))
,但这没有任何作用。你能指导我正确的方向吗?谢谢
我不确定您所说的“return 情节 .... 到应用程序”是什么意思。如果您只想显示绘图,那么这似乎可以解决您代码中的问题:
# Mod1.R File
modUI <- function(id) {
ns <- NS(id)
tagList(
fluidRow(
column(
width = 12,
numericInput(ns("num"), "Choose a number to plot", value = 3),
uiOutput(ns("bins"))
)
)
)
}
modServer <- function(input, output, session) {
ns <- session$ns
output$bins <- renderUI({
tagList(
selectInput(ns("plot_type"), "select plot", c("hist", "plot")),
plotOutput(ns("plott"))
)
})
output$plott <- renderPlot(
if (input$plot_type == "hist"){
hist(input$num)
} else (
plot(input$num)
)
)
}
##############
# App.R File
library(shiny)
library(tidyverse)
# Modules
# Main App ----------------------------------------------------------------
ui <- fluidPage(
modUI("ssss")
) # Fluid Page
server <- function(input, output, session) {
callModule(modServer, "ssss")
}
shinyApp(ui, server)
如果你真正想要return情节而不是简单地显示 它,那么你需要创建一个包含 output$plott
反应之外的情节的反应,然后 return 那个反应( 不是 它的值)模块 UI。类似于:
modServer <- function(input, output, session) {
ns <- session$ns
output$bins <- renderUI({
tagList(
selectInput(ns("plot_type"), "select plot", c("hist", "plot")),
plotOutput(ns("plott"))
)
})
myPlot <- reactive({
if (input$plot_type == "hist"){
hist(input$num)
} else (
plot(input$num)
)
})
output$plott <- renderPlot({
myPlot()
})
return(myPlot)
}
和
server <- function(input, output, session) {
mainServerPlot <- callModule(modServer, "ssss")
}
然后您可以在主服务器中使用 mainServerPlot()
引用由模块 return 编辑的绘图对象。
我想了解如何将信息从模块传递到 Shiny App 的主服务器。这是对我的实际代码的过度简化,所以我知道它可以用不同的方式完成,但我需要主要用 server.R 文件中的 callModule
来完成。
# Mod1.R File
modUI <- function(id) {
ns <- NS(id)
tagList(
fluidRow(
column(
width = 12,
numericInput(ns("num"), "Choose a number to plot", value = 3),
uiOutput(ns("bins"))
)
)
)
}
modServer <- function(input, output, session) {
ns <- session$ns
output$bins <- renderUI(
ns <- session$ns,
selectInput(ns("plot_type"), "select plot", c("hist", "plot")),
plotOutput(ns("plott"))
)
output$plott <- renderPlot(
if (input$plot_type == "hist"){
hist(input$num)
} else (
plot(input$num)
)
)
}
##############
# App.R File
library(shiny)
library(tidyverse)
# Modules
source("mod1.R")
# Main App ----------------------------------------------------------------
ui <- fluidPage(
modUI("ssss")
) # Fluid Page
server <- function(input, output, session) {
callModule(modServer, "ssss")
}
shinyApp(ui, server)
我正在尝试 return 应该在 Mod1.R 文件中生成的绘图到服务器函数中的 App.R 文件,但我不太确定如何去做这个。我知道我应该在 Mod1.R 文件中 return 一个反应性输出,例如:return(reactive(output$plott))
,但这没有任何作用。你能指导我正确的方向吗?谢谢
我不确定您所说的“return 情节 .... 到应用程序”是什么意思。如果您只想显示绘图,那么这似乎可以解决您代码中的问题:
# Mod1.R File
modUI <- function(id) {
ns <- NS(id)
tagList(
fluidRow(
column(
width = 12,
numericInput(ns("num"), "Choose a number to plot", value = 3),
uiOutput(ns("bins"))
)
)
)
}
modServer <- function(input, output, session) {
ns <- session$ns
output$bins <- renderUI({
tagList(
selectInput(ns("plot_type"), "select plot", c("hist", "plot")),
plotOutput(ns("plott"))
)
})
output$plott <- renderPlot(
if (input$plot_type == "hist"){
hist(input$num)
} else (
plot(input$num)
)
)
}
##############
# App.R File
library(shiny)
library(tidyverse)
# Modules
# Main App ----------------------------------------------------------------
ui <- fluidPage(
modUI("ssss")
) # Fluid Page
server <- function(input, output, session) {
callModule(modServer, "ssss")
}
shinyApp(ui, server)
如果你真正想要return情节而不是简单地显示 它,那么你需要创建一个包含 output$plott
反应之外的情节的反应,然后 return 那个反应( 不是 它的值)模块 UI。类似于:
modServer <- function(input, output, session) {
ns <- session$ns
output$bins <- renderUI({
tagList(
selectInput(ns("plot_type"), "select plot", c("hist", "plot")),
plotOutput(ns("plott"))
)
})
myPlot <- reactive({
if (input$plot_type == "hist"){
hist(input$num)
} else (
plot(input$num)
)
})
output$plott <- renderPlot({
myPlot()
})
return(myPlot)
}
和
server <- function(input, output, session) {
mainServerPlot <- callModule(modServer, "ssss")
}
然后您可以在主服务器中使用 mainServerPlot()
引用由模块 return 编辑的绘图对象。