【问题标题】:Keep plots and input values when switching between tabs在选项卡之间切换时保留绘图和输入值
【发布时间】:2018-12-25 01:52:50
【问题描述】:

我有一个带有两个不同选项卡面板的闪亮仪表板应用程序。每个选项卡都有不同的输入值,当单击操作按钮时,它们都会生成一个图表。

每当我在这些选项卡之间切换时,它们各自的图表都会消失,输入值会重置为默认值。

即使用户决定在面板之间切换,我也希望将选项卡保持在用户修改的状态(即同时保留图形和输入)。

代码

library(shiny)
library(shinydashboard)


ui <- fluidPage(
  dashboardPage(
    dashboardHeader(title = "DASHBOARD"),

    dashboardSidebar(
      uiOutput("mysidebar"),
    ),

    dashboardBody(
      tabsetPanel(type = "tabs", id = "tab", 
                  tabPanel("Tab1", fluid = TRUE, value = 1,plotOutput("A")),
                  tabPanel("Tab2", fluid = TRUE, value = 2, plotOutput("B"))
      )
    )
  )

)

server <- function(input, output, session){
  output$mysidebar <- renderUI({

    if(input$tab == 1){
      tagList(
        sliderInput(inputId = "Sample",
                    label = "Enter Number of Samples:",
                    min = 1000, max = 100000,
                    value = 10000),
        fluidRow(
          column(6,
                 actionButton(inputId = "b1", label = "Generate"))
        )}

    if(input$tab == 2){
      tagList(
        sliderInput(inputId = "Weight",
                    label = "Enter Weight:",
                    value = 100),
        fluidRow(
          column(6,
                 actionButton(inputId = "b2", label = "Generate"))
        )}

    p1<- eventReactive(input$b1, {
      #creating a dataframe using input "Sample" in tab1 - Rough example
      df <- input$Sample

    })
    output$SA <- renderPlot({

        plot(df)

    })

    p2 <- eventReactive(input$b2, {
      #creating a dataframe using input "Weight" in tab2-- Rough example
      df2 <- input$Weight

    })
    output$A <- renderPlot({

      plot(p1())

    })
   output$B <- renderPlot({

      plot(p2())

    })
}

【问题讨论】:

  • 您的代码不起作用。有一些语法错误
  • 在 eventReactive 函数 p1 和 p2 中,我刚刚使用选项卡中的输入样本创建了一个数据框。我还没有写一个确切的代码。这只是一个粗略的例子,让您了解我想要做什么。然后我使用这些函数来绘制每个选项卡的输出。
  • 仍然,复制您的代码并尝试运行它。它不会工作。在用户界面中,您将fluidPage 与dashboardPage 混合在一起,而在服务器中,我认为缺少一些括号。
  • 好的,可能缺少一些括号,因为我从一个大代码中提取了这个示例块。主要问题是我的绘图正在消失,并且每当我在选项卡之间切换时,输入都会重置为默认值。大体思路是一样的。从特定选项卡获取输入,创建数据框,然后绘制该数据框。
  • 每当renderUI 中的任何地方发生变化时,它都会重新制作小部件和输出,如果您需要保留地块,这不是设计它的好方法

标签: r shiny shiny-server shinydashboard


【解决方案1】:

我更希望你在shinyjs 包中使用showhide 功能,如下例所示,这样当你在选项卡之间切换时,值将被保留

library(shiny)
library(shinyjs)
library(shinydashboard)


ui <- fluidPage(
  dashboardPage(
    dashboardHeader(title = "DASHBOARD"),

    dashboardSidebar(
      useShinyjs(),
      sliderInput("Sample","Enter Number of Samples:",min = 1000, max = 100000,value = 10000),
      sliderInput("Weight","Enter Weight:",min = 1, max = 1000,value = 100),
      fluidRow(column(6,actionButton("b1","Generate"),actionButton("b2","Generate")))
    ),

    dashboardBody(
      tabsetPanel(type = "tabs", id = "tab", 
                  tabPanel("Tab1", fluid = TRUE, value = 1,plotOutput("A")),
                  tabPanel("Tab2", fluid = TRUE, value = 2, plotOutput("B"))
      )
    )
  )

)

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

  observe({
    if(input$tab == 1){
      show("Sample")
      show("b1")
      hide("Weight")
      hide("b2")
    }
    if(input$tab == 2){
      hide("Sample")
      hide("b1")
      show("Weight")
      show("b2")
    }
  })

  p1<- eventReactive(input$b1,{
    df <- rnorm(input$Sample)
  })
  output$SA <- renderPlot({
    plot(df)
  })

  p2 <- eventReactive(input$b2,{
    df2 <- rnorm(input$Weight)
  })

  output$A <- renderPlot({plot(p1())})
  output$B <- renderPlot({plot(p2())})
}

shinyApp(ui, server)

【讨论】:

  • 这确实是一个更好的选择!
【解决方案2】:

以下代码使用reactiveValues 保留绘图和输入。

library(shiny)
library(shinydashboard)


ui <- dashboardPage(dashboardHeader(title = "DASHBOARD"),

                    dashboardSidebar(
                      uiOutput("mysidebar")
                    ),

                    dashboardBody(
                      tabsetPanel(type = "tabs", id = "tab",
                                  tabPanel("Tab1",  value = 1,plotOutput("SA")),
                                  tabPanel("Tab2",  value = 2, plotOutput("SA1"))
                      )
                    )
)


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

  slider_react <- reactiveValues(b1=10000, b2 = 100)

  observe({
    if (input$tab == 1){
      output$mysidebar <- renderUI({
        tagList(
          sliderInput(inputId = "Sample",
                      label = "Enter Number of Samples:",
                      min = 1000, max = 100000,
                      # value = 10000),
                      value = slider_react$b1),
          actionButton(inputId = "b1", label = "Generate"))
      })
    }

    if(input$tab == 2){
      output$mysidebar <- renderUI({
        tagList(
          sliderInput(inputId = "Weight",
                      label = "Enter Weight:",
                      min=0, max=1000,
                      # value = 100),
                      value = slider_react$b2),
          actionButton(inputId = "b2", label = "Generate"))
      })
    }
  })


  df_react <- reactiveValues(a1=NULL, a2=NULL)

  p1<- observeEvent(input$b1, {
    #creating a dataframe using input "Sample" in tab1 - Rough example
    df <- runif(input$Sample, 0, 100)
    slider_react$b1 = input$Sample
    df_react$a1 = df
  })
  p2 <- observeEvent(input$b2, {
    #creating a dataframe using input "Weight" in tab2-- Rough example
    df2 <- runif(input$Weight, 0, 100)
    slider_react$b2 = input$Weight
    df_react$a2 = df2
  })

  output$SA <- renderPlot({
    req(df_react$a1)
    plot(df_react$a1)
  })

  output$SA1 <- renderPlot({
    req(df_react$a2)
    plot(df_react$a2)

  })
}

shinyApp(ui, server)

【讨论】:

  • 非常感谢!现在工作正常。关于如何保留输入的任何线索?
  • 查看@Pork Chop 的答案。输入是在 ui 中创建的,他使用 shinyjs 显示/隐藏元素。像这样,每次在选项卡之间切换时都不会重新创建滑块输入。我认为解决方案更清晰,更容易
  • 刚刚编辑了我的答案。现在,输入也被保留,通过使用另一个 reactiveValues 对象来存储滑块值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 2023-03-13
  • 1970-01-01
相关资源
最近更新 更多