2016-10-19 73 views
0

在下面的小例子,注意,雖然file.choose()行註釋掉,代碼按預期工作:點擊輸入選項卡切換的確定按鈕將結果標籤。updateTabsetPanel現在,沒有延遲

然而,取消對file.choose()線和updateTabsetPanel()功能不再起作用。在file.choose()開始前有什麼方法讓屏幕更改屏幕?

ui <- fluidPage(fluidRow(
     tabsetPanel(id="main", 
      tabPanel("Input", actionButton("okButton", "OK")), 
      tabPanel("Results", h3(textOutput("results"))) 
     ))) 

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

    output$results = renderText("Results Tab") 

    observeEvent(input$okButton, { 
     updateTabsetPanel(session, "main", "Results") 
    # file.choose() 
    }) 

} 

shinyApp(ui = ui, server = server) 

回答

0

您可以分兩步進行:1.切換選項卡; 2.基於標籤切換事件,打開文件選擇窗口。

ui <- fluidPage(fluidRow(
    tabsetPanel(id="main", 
       tabPanel("Input", actionButton("okButton", "OK")), 
       tabPanel("Results", h3(textOutput("results"))) 
))) 

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

    output$results = renderText("Results Tab") 

    observeEvent(input$okButton, { 
    updateTabsetPanel(session, "main", "Results") 
    }) 

    observeEvent(input$main, { 
    if (input$main == "Results") { 
     file.choose() 
    } 
    }) 

} 

shinyApp(ui = ui, server = server) 
+0

對於這個最簡單的例子來說,它確實很好用,但是在較大的項目中,我已經觀察了標籤菜單事件並將它們用於別的東西。我想我可以在這個事件中設置一個標誌,但是我真的希望在updateTabsetPanel()和file.choose()之間插入一些命令,告訴Shiny I'在這裏等待它清除其未完成的任務。 (在真實的應用程序中,file.choose()之後有幾個進度條的任務很長) – 3D0G

+0

這似乎不可能。當您將多個命令放入反應式命令中時,結果總是返回同一時間,不同之處在於您使用Javascript或在中間調用另一個R進程。 –

+0

進一步思考,你的解決方案是唯一的可能性。否則,updateTabsetPanel()將啓動一個不同的observeEvent()(對於該選項卡),而我仍然處於這個中間位置。感謝您幫助我思考。我想我只是將所需的所有數據保存在第一個observeEvent()中,並且有一個不同的observeEvent()按鈕,用於根據保存的數據啓動所有處理。 – 3D0G