如何消除 R Shiny 中反应图下方的空 space?
How can I eliminate empty space below a reactive plot in R Shiny?
我有一个复杂的 R shiny 应用程序,它利用了多个模块。我有两个不同的模块(我称之为直方图模块和散点图模块),每个模块都输出一个反应图。根据用户输入,一次只能显示这些图中的一个。我可以通过单选按钮选择来管理它——用户只需选择直方图或散点图。
我很难以吸引人的方式安排这两个反应性情节输出。我希望直方图和散点图与页面的左上部分对齐。如果我的直方图在我的 UI 中排在第一位,当用户选择散点图时,此散点图呈现在一个大空白 space 下方。当用户选择直方图时,这个大空白 space 会被填充,但我希望这个 'bottom' 图仍然显示在闪亮的应用程序的顶部。
在我使用模块之前的闪亮日子里,我只是将我的绘图输出放在 UI 的条件面板中(例如,conditionalPanel("input.displayPlot", plotOutput("plot1"))
但是,现在我有一个复杂的模块,我没有将输入逻辑放入条件面板(至少我认为我没有)。
我尽可能简单地创建了一个可重现的示例来重现此问题。当用户选择散点图时,它会显示在一个大空白 space 下方。我真的更愿意在我的模块中保留直方图与散点图的单选按钮选择(因为它也是基于其他复杂逻辑的反应式显示),但这可能是不可能的。
histogramPlotOutput <- function(id) {
tagList(
plotOutput(NS(id, "histogram"))
)
}
histogramUIOutput <- function(id) {
tagList(
uiOutput(NS(id, "buttons"))
)
}
histogramServer <- function(id
) {
moduleServer(id, function(input, output, session) {
output$histogram <- renderPlot({
req(input$radiobuttons)
if(input$radiobuttons){
p <- hist(mtcars[["mpg"]])
p
}
})
output$buttons <- renderUI({
radioButtons(NS(id, "radiobuttons"),
label = "Display Histogram?",
choices = c(TRUE, FALSE),
selected = TRUE)
})
# export the reactive button selection out of histogram server
# this will be used as an input by scatterPlotServer to
# determine if an alternate plot should be displayed
reactive(
input$radiobuttons
)
})
}
scatterPlotOutput <- function(id) {
tagList(
plotOutput(NS(id, "scatterplot"))
)
}
scatterPlotServer <- function(id,
display_histogram = TRUE
)
{
moduleServer(id, function(input, output, session) {
output$scatterplot <- renderPlot({
if(display_histogram() == FALSE){
p <- plot(mtcars$mpg, mtcars$hp)
p
}
})
})
}
myApp <- function(){
ui <- fluidPage(
histogramPlotOutput("hist1"),
scatterPlotOutput("scat1"),
histogramUIOutput("hist1")
)
server <- function(input, output, session) {
display_hist <- histogramServer("hist1")
scatterPlotServer("scat1",
display_histogram = reactive(display_hist()))
}
shinyApp(ui, server)
}
myApp()
提前感谢您的帮助!
您可能想使用 renderUI()/uiOutput()
来显示您的任一绘图:
myApp <- function(){
ui <- fluidPage(
uiOutput("plot"),
histogramUIOutput("hist1")
)
server <- function(input, output, session) {
display_hist <- histogramServer("hist1")
scatterPlotServer("scat1",
display_histogram = reactive(display_hist()))
output$plot <- renderUI({
if(req(display_hist()))
histogramPlotOutput("hist1")
else
scatterPlotOutput("scat1")
})
}
shinyApp(ui, server)
}
我有一个复杂的 R shiny 应用程序,它利用了多个模块。我有两个不同的模块(我称之为直方图模块和散点图模块),每个模块都输出一个反应图。根据用户输入,一次只能显示这些图中的一个。我可以通过单选按钮选择来管理它——用户只需选择直方图或散点图。
我很难以吸引人的方式安排这两个反应性情节输出。我希望直方图和散点图与页面的左上部分对齐。如果我的直方图在我的 UI 中排在第一位,当用户选择散点图时,此散点图呈现在一个大空白 space 下方。当用户选择直方图时,这个大空白 space 会被填充,但我希望这个 'bottom' 图仍然显示在闪亮的应用程序的顶部。
在我使用模块之前的闪亮日子里,我只是将我的绘图输出放在 UI 的条件面板中(例如,conditionalPanel("input.displayPlot", plotOutput("plot1"))
但是,现在我有一个复杂的模块,我没有将输入逻辑放入条件面板(至少我认为我没有)。
我尽可能简单地创建了一个可重现的示例来重现此问题。当用户选择散点图时,它会显示在一个大空白 space 下方。我真的更愿意在我的模块中保留直方图与散点图的单选按钮选择(因为它也是基于其他复杂逻辑的反应式显示),但这可能是不可能的。
histogramPlotOutput <- function(id) {
tagList(
plotOutput(NS(id, "histogram"))
)
}
histogramUIOutput <- function(id) {
tagList(
uiOutput(NS(id, "buttons"))
)
}
histogramServer <- function(id
) {
moduleServer(id, function(input, output, session) {
output$histogram <- renderPlot({
req(input$radiobuttons)
if(input$radiobuttons){
p <- hist(mtcars[["mpg"]])
p
}
})
output$buttons <- renderUI({
radioButtons(NS(id, "radiobuttons"),
label = "Display Histogram?",
choices = c(TRUE, FALSE),
selected = TRUE)
})
# export the reactive button selection out of histogram server
# this will be used as an input by scatterPlotServer to
# determine if an alternate plot should be displayed
reactive(
input$radiobuttons
)
})
}
scatterPlotOutput <- function(id) {
tagList(
plotOutput(NS(id, "scatterplot"))
)
}
scatterPlotServer <- function(id,
display_histogram = TRUE
)
{
moduleServer(id, function(input, output, session) {
output$scatterplot <- renderPlot({
if(display_histogram() == FALSE){
p <- plot(mtcars$mpg, mtcars$hp)
p
}
})
})
}
myApp <- function(){
ui <- fluidPage(
histogramPlotOutput("hist1"),
scatterPlotOutput("scat1"),
histogramUIOutput("hist1")
)
server <- function(input, output, session) {
display_hist <- histogramServer("hist1")
scatterPlotServer("scat1",
display_histogram = reactive(display_hist()))
}
shinyApp(ui, server)
}
myApp()
提前感谢您的帮助!
您可能想使用 renderUI()/uiOutput()
来显示您的任一绘图:
myApp <- function(){
ui <- fluidPage(
uiOutput("plot"),
histogramUIOutput("hist1")
)
server <- function(input, output, session) {
display_hist <- histogramServer("hist1")
scatterPlotServer("scat1",
display_histogram = reactive(display_hist()))
output$plot <- renderUI({
if(req(display_hist()))
histogramPlotOutput("hist1")
else
scatterPlotOutput("scat1")
})
}
shinyApp(ui, server)
}