2017-09-05 49 views
0

假设我有一个条件面板有条件的输出情节

fluidRow(column(12,selectInput("models", label = "Models",choices =list("choice 1"=1,"choice 2"=2))))  

tabsetPanel(tabPanel(strong("plots"), 
          plotOutput("plot 1"), 
          plotOutput("plot 2"))) 

现在,根据一些选择输入值,我想表明plot 1plot 2。有没有办法在一个闪亮的应用程序?

+0

您可能需要'conditionalPanel'请提供一个可重复的示例,以便其他人可以更好地帮助您 – akrun

+1

我更喜欢使用'shinyjs :: hide' http://deanattali.com/2015/04/23/shinyjs-r- package/ – PoGibas

+0

另一种可能性是有一个'plotOutput',并选择在服务器上呈现哪个图表,例如类似于'if(identical(input $ selectvalue,“plot1”{plot1()} else plot2())' –

回答

1

第一个版本,以选择在渲染:

library(shiny) 


ui <- fluidPage(fluidRow(column(12,selectInput("models", label = "Models",choices =list("A-Plots"=1,"B-Plots"=2)))),  

tabsetPanel(tabPanel(strong("plots"), 
        lapply(1:5, function(i) plotOutput(paste0("plot", i)))))) 

server <- function(session, input, output) { 

plotsA <- lapply(1:5, function(x) function(y) (plot(1:10, main=paste("Plot A", x)))) 

plotsB <- lapply(1:5, function(x) function(y) (plot(1:10, main=paste("Plot B", x)))) 

for (i in 1:5) local({ 
    my_i <- i 
    output[[paste0("plot", my_i)]] <- renderPlot({ 
    switch(input$models, "1"=plotsA, "2"=plotsB)[[my_i]]()}) 
})} 

shinyApp(ui = ui, server = server) 

版本2 conditionalPanel

库(闪亮)

ui <- fluidPage(fluidRow(column(12,selectInput(
    "models", label = "Models", choices =list("A-Plots"=1,"B-Plots"=2)))),  

tabsetPanel(tabPanel(strong("plots"), 
        conditionalPanel("input.models==1", 
         lapply(1:5, function(i) plotOutput(paste0("plot", i)))), 
        conditionalPanel("input.models==2", 
         lapply(6:10, function(i) plotOutput(paste0("plot", i))))))) 

server <- function(session, input, output) { 

    plotsA <- lapply(1:5, function(x) function(y) (plot(1:10, main=paste("Plot A", x)))) 

    plotsB <- lapply(1:5, function(x) function(y) (plot(1:10, main=paste("Plot B", x)))) 

    for (i in 1:5) local({ 
    my_i <- i 
    output[[paste0("plot", my_i)]] <- renderPlot({plotsA[[my_i]]()}) 
    }) 

    for (i in 6:10) local({ 
    my_i <- i 
    output[[paste0("plot", my_i)]] <- renderPlot({plotsB[[my_i-5]]()}) 
    }) 

} 

shinyApp(ui = ui, server = server) 

第三种选择,与uiOutput

library(shiny) 


ui <- fluidPage(fluidRow(column(12,selectInput(
    "models", label = "Models", choices =list("A-Plots"=1,"B-Plots"=2)))),  

tabsetPanel(tabPanel(strong("plots"), 
        uiOutput("plots")))) 

server <- function(session, input, output) { 

    plotsA <- lapply(1:5, function(x) function(y) (plot(1:10, main=paste("Plot A", x)))) 

    plotsB <- lapply(1:5, function(x) function(y) (plot(1:10, main=paste("Plot B", x)))) 

    output$plots <- renderUI(lapply(switch(input$models, "1"=1:5, "2"=6:10), 
            function(y) plotOutput(paste0("plot", y)))) 

    for (i in 1:5) local({ 
    my_i <- i 
    output[[paste0("plot", my_i)]] <- renderPlot({plotsA[[my_i]]()}) 
    }) 

    for (i in 6:10) local({ 
    my_i <- i 
    output[[paste0("plot", my_i)]] <- renderPlot({plotsB[[my_i-5]]()}) 
    }) 

} 

shinyApp(ui = ui, server = server) 

在所有情况下,只有在您实际显示该情节时才应该准备情节。