自定义页面计数器在新会话中无法正常运行

汤姆·C

当我开始一个新的R会话时,下面的代码将无法正常工作:当我第一次按下“下一步”按钮时,计数器将递增一个增量,但条件面板不会发生变化。如果我在同一会话中重新加载该应用程序,则没有问题。

到底是怎么回事?任何帮助将非常感激!

shinyUI(
  fluidPage(

    fluidRow(


         column(12,
             fluidRow(

               h5(" "),
               HTML("<br>"),

               column(width = 4, style="height:360px",
                      tabsetPanel(
                        tabPanel(h4("Financial",style = "color:black"),


                            conditionalPanel(width=4,condition="output.Fpanel==undefined|output.Fpanel==0",
                                             h5("Intro to finance",style="color:grey")),

                            conditionalPanel(width=4,condition="output.Fpanel==1",#|"output.Fpanel==undefined",
                                             h5("1. Description")),

                            conditionalPanel(width=4,condition="output.Fpanel==2",#|"output.Fpanel==undefined",
                                             h5("2. Products")),

                            conditionalPanel(width=4,condition="output.Fpanel==3",#|"output.Fpanel==undefined",
                                             h5("3. HR")),

                            conditionalPanel(width=4,condition="output.Fpanel==4",#|"output.Fpanel==undefined",
                                             h5("4. Reporting")),

                            value=1),

                        id = "tabs1"
                      )

               ),


               column(width = 8,style="height:360px",

                      HTML("<br><br>"),
                      hr(),

                      # --------- Fishery panel guides ---------------------------------------------------------------------------------------------------------------

                      conditionalPanel(condition="input.tabs1==1&output.Fpanel==0",
                          h5("",style = "color:grey")
                      ),

                      conditionalPanel(condition="input.tabs1==1&output.Fpanel==1",
                         h5("Some text for panel 1",style = "color:grey")
                      ),

                      conditionalPanel(condition="input.tabs1==1&output.Fpanel==2",
                                       h5("Some text for panel 2",style = "color:grey")
                      ),

                      conditionalPanel(condition="input.tabs1==1&output.Fpanel==3",
                                       h5("Some text for panel 3",style = "color:grey")
                      ),

                      conditionalPanel(condition="input.tabs1==1&output.Fpanel==4",
                                       h5("Some text for panel 4",style = "color:grey")
                      )
                )
             )
         ),     

        column(12,style="height:80px",
            fluidRow(

               column(width = 1,
                 conditionalPanel(condition="(input.tabs1==1 & output.Fpanel>1)",
                    actionButton("Fback","< Back")
                 ),
                 conditionalPanel(condition="!(input.tabs1==1 & output.Fpanel>1)",
                                  actionButton("FbackD","< Back",style="color: #CFCFCF;  border-color: #CFCFCF") #background-color: #CFCFCF;
                 )

                ),

                column(width = 1,
                 conditionalPanel(condition="(input.tabs1==1 & output.Fpanel<4)",
                    actionButton("Fcont","Next >")
                 ),
                 conditionalPanel(condition="!(input.tabs1==1 & output.Fpanel<4)",
                                  actionButton("FcontD","Next >",style="color: #CFCFCF;  border-color: #CFCFCF") #background-color: #CFCFCF;
                 )

                ),

               column(width=2,#style="height:180px",
                      conditionalPanel(condition="output.Fpanel>0|output.Fpanel!=undefined",
                                       #h4("Progress",style="color:grey"),
                                       #hr(),
                                       textOutput("Fpanelout"),
                                       textOutput("Mpanelout"),
                                       textOutput("Dpanelout")

                      )
               ),
               column(4,offset=1,style="height:80px",

                      conditionalPanel(condition="output.Fpanel==undefined",
                                       actionButton("start",h5("START",style="color:green"),width=300)
                      ),
                      conditionalPanel(condition="!(output.Fpanel==undefined)",
                                       actionButton("Calculate",h5("CALCULATE",style="color:red"),width=300)
                      )

               )
            )
        )

)))


shinyServer(function(input, output, session) {

    observeEvent(input$Fback,{
      if(input$tabs1==1){
        if(Fpanel == 1){
          Fpanel<<-1
        }else{
          Fpanel<<-(Fpanel-1)
        }
      }
      output$Fpanelout <- renderText({ paste(Fpanel,"/ 4")})
    })  

    observeEvent(input$Fcont,{
      if(input$tabs1==1){
        if(Fpanel == 14){
          Fpanel<<-14
        }else{
          Fpanel<<-(Fpanel+1)
        }
      }
      output$Fpanelout <- renderText({ paste(Fpanel,"/ 4")})
    })  

    output$Fpanel <- eventReactive({
      input$Fcont
      input$Fback
      input$Load
      input$start
    },{
      Fpanel
    },ignoreInit=FALSE)


    observeEvent(input$start,{
      output$Fpanelout <- renderText({ paste(Fpanel,"/ 4")})
    })

    Fpanel<<-1
    outputOptions(output,"Fpanel",suspendWhenHidden=FALSE)

  })
罗德

您正在观察已安装的可观察对象的执行顺序问题

两种表达

output$Fpanel <- eventReactive({
  input$Fcont
  input$Fback
  input$Load
  input$start
},{
  Fpanel
},ignoreInit=FALSE)

observeEvent(input$Fcont,{
  if(input$tabs1==1){
    if(Fpanel == 14){
      Fpanel<<-14
    }else{
      Fpanel<<-(Fpanel+1)
    }
  }
  output$Fpanelout <- renderText({ paste(Fpanel,"/ 4")})
})

通过单击对下一个按钮做出反应input$Fcont您可能会注意到,这些执行完全相互独立。但是,您假设第一个总是在第二个之后触发,则建立了逻辑。

有关执行调度闪亮的文档,你可以了解观察到的终点

如果在多个端点无效时发生刷新,则无法保证端点将执行

因此,有时您的面板没有更新,因为前一个值是(重新)分配的,而不是下一个值。这是非常不寻常的,当重新启动会话时,不会更频繁可靠地发生此问题如果要自己进行测试,print请在可观察对象内部添加一些命令以查看它们的调用顺序。

一个解决方案是避免那些同时执行的模式,并创建一个可靠的反应链,无论如何保持正确的关系。

下面是一个重构的代码示例,它显示了您要创建依赖项的方式。我将Fpanel变成areactiveVal并直接对其进行操作,这样Fpanel始终保持正确的值。(此外,由于reactiveVal()JavaScript端的默认值是,null而不是undefined,因此我重写了条件,例如0新的起始值。)

library(shiny)

ui <- shinyUI(
  fluidPage(
    fluidRow(
      column(12,
        fluidRow(  
          h5(" "),
          HTML("<br>"),
          column(width = 4, style="height:360px",
            tabsetPanel(id = "tabs1",
              tabPanel(value=1,
                h4("Financial",style = "color:black"),
                conditionalPanel(width=4,condition="output.Fpanel==0",
                  h5("Intro to finance",style="color:grey")
                ),
                conditionalPanel(width=4,condition="output.Fpanel==1",
                  h5("1. Description")
                ),
                conditionalPanel(width=4,condition="output.Fpanel==2",
                  h5("2. Products")
                ),
                conditionalPanel(width=4,condition="output.Fpanel==3",
                  h5("3. HR")
                ),
                conditionalPanel(width=4,condition="output.Fpanel==4",
                  h5("4. Reporting")
                ),
              )
            )
          ),
          column(width = 8,style="height:360px",
            HTML("<br><br>"),
            hr(),
            # --------- Fishery panel guides ---------------------------------------------------------------------------------------------------------------
            conditionalPanel(condition="input.tabs1==1&output.Fpanel==0",
              h5("",style = "color:grey")
            ),
            conditionalPanel(condition="input.tabs1==1&output.Fpanel==1",
              h5("Some text for panel 1",style = "color:grey")
            ),
            conditionalPanel(condition="input.tabs1==1&output.Fpanel==2",
              h5("Some text for panel 2",style = "color:grey")
            ),
            conditionalPanel(condition="input.tabs1==1&output.Fpanel==3",
              h5("Some text for panel 3",style = "color:grey")
            ),
            conditionalPanel(condition="input.tabs1==1&output.Fpanel==4",
              h5("Some text for panel 4",style = "color:grey")
            )
          )
        )
      ),
      column(12,style="height:80px",
        fluidRow(
          column(width = 1,
            conditionalPanel(condition="(input.tabs1==1 & output.Fpanel>1)",
              actionButton("Fback","< Back")
            ),
            conditionalPanel(condition="!(input.tabs1==1 & output.Fpanel>1)",
              actionButton("FbackD","< Back",style="color: #CFCFCF;  border-color: #CFCFCF") #background-color: #CFCFCF;
            )
          ),
          column(width = 1,
            conditionalPanel(condition="(input.tabs1==1 & output.Fpanel<4)",
              actionButton("Fcont","Next >")
            ),
            conditionalPanel(condition="!(input.tabs1==1 & output.Fpanel<4)",
              actionButton("FcontD","Next >",style="color: #CFCFCF;  border-color: #CFCFCF") #background-color: #CFCFCF;
            )
          ),
          column(width=2,#style="height:180px",
            conditionalPanel(condition="output.Fpanel>0",
              #h4("Progress",style="color:grey"),
              #hr(),
              textOutput("Fpanelout"),
              textOutput("Mpanelout"),
              textOutput("Dpanelout")
            )
          ),
          column(4,offset=1,style="height:80px",
            conditionalPanel(condition="output.Fpanel==0",
              actionButton("start",h5("START",style="color:green"),width=300)
            ),
            conditionalPanel(condition="output.Fpanel>0",
              actionButton("Calculate",h5("CALCULATE",style="color:red"),width=300)
            )
          )
        )
      )
    )
  )
)

server <- shinyServer(function(input, output, session) {
  Fpanel <- reactiveVal(0)

  output$Fpanel <- reactive({ Fpanel() })
  outputOptions(output,"Fpanel",suspendWhenHidden=FALSE)

  output$Fpanelout <- renderText({ paste(Fpanel(),"/ 4")})

  observeEvent(input$start, Fpanel(1))

  observeEvent(input$Fback,{
    if(input$tabs1 == 1 && Fpanel() > 1){
      Fpanel(Fpanel() - 1)
    }
  })  

  observeEvent(input$Fcont,{
    if(input$tabs1==1 && Fpanel() < 14){
      Fpanel(Fpanel() + 1)
    }
  })
})

shinyApp(ui, server)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章