2016-10-19 2 views
0

В следующем минимальном примере, обратите внимание, что в то время как линия file.choose() закомментирована, код работает, как ожидалось: нажав кнопку OK на Input закладок переключателей на Результаты табла.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 ' d ждут здесь, чтобы очистить свои ожидающие задачи. (В реальном приложении есть долгая задача с несколькими индикаторами выполнения после файла file.choose()) – 3D0G

+0

Это не представляется возможным. Когда вы добавляете несколько команд в реактивную команду, результаты всегда возвращают одно и то же время, за исключением того, что вы используете Javascript или вызываете другой R-процесс посередине. –

+0

Подумайте, ваше решение - это единственная возможность. В противном случае updateTabsetPanel() запустит другой элемент registerEvent() (для вкладки), пока я все еще посередине этого. Спасибо, что помогли мне продумать это. Я думаю, что я просто сохраню все данные, которые мне нужны в первом элементе наблюдения(), и у меня есть другая кнопка registerEvent(), которая инициирует всю обработку на основе сохраненных данных. – 3D0G

Смежные вопросы