【发布时间】:2021-11-07 20:32:41
【问题描述】:
我期待:
- 插入 UI 元素
- 更新 UI 元素
- 运行长时间计算
全部按下一个按钮。示例应用:
ui <- fluidPage(
useShinyjs(),
mainPanel(
tabsetPanel(
id = "test",
tabPanel(
title = "First",
actionButton(
"press",
"Press Me")),
tabPanel(
title = "Second",
tabsetPanel(
id = "toinsert"
)))
)
)
server <- function(input, output, session) {
observe({
disable(selector = '#test a[data-value = "Second"]')
})
totest <- reactiveValues()
totest$tab <- 0
observeEvent(input$press,{
enable(selector = '#test a[data-value = "Second"]')
updateTabsetPanel(
session,
'test',
selected = "Second"
)
totest$tab <- totest$tab + 1
insertTab(
session = session,
inputId = "toinsert",
tab = tabPanel(
title = paste0("AA_",totest$tab),
div(p("BBBBB"))
)
)
updateTabsetPanel(
session,
'toinsert',
selected = paste0("AA_",totest$tab)
)
totest$a <- 1
})
observeEvent(totest$a,{
if(totest$a == 1){
Sys.sleep(5)
print("A")
totest$a <- 0
}else{}
})
}
shinyApp(ui, server)
运行前面的示例,您会注意到代码运行正确但出现了乱序:首先运行计算,然后更新 UI 元素。在 stackoverflow 上搜索我发现了一个类似的问题 R shiny: Update tabsetpanel before finishing all the observeEvent code 并尝试接受的答案将我的 observeEvent 代码更改为:
observeEvent(input$press,{
enable(selector = '#test a[data-value = "Second"]')
updateTabsetPanel(
session,
'test',
selected = "Second"
)
totest$tab <- totest$tab + 1
insertTab(
session = session,
inputId = "toinsert",
tab = tabPanel(
title = paste0("AA_",totest$tab),
div(p("BBBBB"))
)
)
updateTabsetPanel(
session,
'toinsert',
selected = paste0("AA_",totest$tab)
)
givingvalue <- reactive({
req(input$toinsert)
totest$a <- 1
})
givingvalue()
})
但这没有用。第一次单击按钮后,UI 更新,但长时间计算没有运行,并且在我第二次按下按钮后,它就像以前的配置一样工作。我假设再次单击按钮后正在运行计算。
为什么会这样?我该如何解决我的问题?
【问题讨论】: