当我开始一个新的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] 删除。
我来说两句