在RShiny中,在conditionalPanel中使用actionButton值会导致许多令人头疼的问题

时间:2017-03-20 07:41:31

标签: r shiny

我花了最后半小时阅读了有关conditionalPanel,actionButtons以及每次按下按钮时它们的值增加1的方法。话虽如此,以下是我在下面尝试做的以及我面临的问题:

问题 我正在使用conditionalPanel在两个不同的renderPlots之间切换。我使用两个不同的renderPlots而不是同一个renderPlot中的两个图的原因是因为两个图具有不同的高度/宽度尺寸是很重要的。我在conditionalPanel中使用actionButton的值,这是很糟糕的。

我想要什么 我希望move.chart显示如果togglemovement actionButton最近按下了2个按钮。如果toggleshotchart最近被按下,我希望显示shot.chart。

我希望我能做什么 如果我只能在条件中使用plotData $值,我会全部设置。 plotData $ value用于输入renderPlots中的if语句以确定应绘制哪些绘图,但我不能在conditionalPanel中使用它们。

所有这些都说,这是我的项目的缩短版本。

library(shiny)

# 2. UI layout
# ============
ui <- fluidPage(
        fluidRow(
          column(width = 4, align = 'center', 
              actionButton(inputId = 'toggleshotchart', label = 'Launch Shots'), 
              actionButton(inputId = 'togglemovement', label = 'Launch Movements')
          ),

          # This displays either the shot or movement chart
          # ===============================================
          column(width = 8, align = 'left',
                 conditionalPanel("input.togglemovement > input.toggleshotchart",
                                  plotOutput('movement.chart', height = 650, width = 1128)
                 ),
                 conditionalPanel("input.togglemovement <= input.toggleshotchart",
                                  plotOutput('shot.chart', height = 846, width = 900)
                 )
          )
        )
)

# 3. Server Layout
# ================
server <- shinyServer(function(input, output) {

  # Create some reactive stuff to toggle charts
  plotData <- reactiveValues(value = NULL)

  observeEvent(input$toggleshotchart, {
    plotData$value <- 0
  })

  observeEvent(input$togglemovement, {
    plotData$value <- 1
  })

  # create the first chart
  output$shot.chart <- renderPlot({

    # this chart is displayed at launch
    if (is.null(plotData$value)) {
      plot(c(1,2,3,4,5), c(1,2,3,4,5))
    }

    # this chart SHOULD BE displayed after clicking toggleshotchart
    else if(plotData$value == 0) {
      hist(rnorm(10))
    }      

    # Do nothing (prev displayed motion chart here)
    else {
      # do nothing
    }
  })

  # this chart SHOULD BE displayed after clicking togglemovementchart
  output$movement.chart <- renderPlot({
    if(plotData$value == 1) {
      hist(c(1,2,3,2,1))
    }
  })
})

shinyApp(ui = ui, server = server)

我读了很多关于重置actionButton的值,但找不到任何可以解决我的问题的东西。似乎将actionButton值重置为0并不容易/无法完成。在我的这个任务中,任何想法都会受到高度赞赏!

编辑 - 之前我问过这个相关的问题 - In RShiny, change plot width / height for separate plots within same renderPlot() - 解决方案的工作原理,但问题略有不同。我越是处理这个问题,就越发现我最初的问题没有解决我的实际问题。

1 个答案:

答案 0 :(得分:2)

如何使用.bigLabel { font-size: 48px; } 在两个地块之间切换?

radioButtons

我也尝试使用library(shiny) # 2. UI layout # ============ ui <- fluidPage( fluidRow( column(width = 4, radioButtons("choice_plot","Launch",choices=list("Shots","Movements"), selected="Shots")), # This displays either the shot or movement chart # =============================================== column(width = 8, align = 'left', uiOutput("plot_ui")) ) ) # 3. Server Layout # ================ server <- shinyServer(function(input, output) { output$plot_ui <- renderUI({ if(input$choice_plot == 'Shots') { plot.width = 1128 plot.height = 650 }else{ plot.width = 900 plot.height = 846 } plotOutput('plot', width = plot.width, height = plot.height) }) output$plot <- renderPlot({ if(input$choice_plot == 'Shots'){ hist(rnorm(10)) }else{ hist(c(1,2,3,2,1)) } }) }) shinyApp(ui = ui, server = server)

actionButton