2014-09-23 37 views
8

Uwaga: Przeczytałem prawie wszystkie dyskusje na ten temat w błyszczących grupach googlegroups i tutaj w SO.błyszczący wskaźnik zajętości aplikacji

Potrzebuję wskaźnika, który pokazuje, że błyszczący serwer jest zajęty. Wypróbowałem błyszczący inkubator, ale problem polega na tym, że nie mogę ustawić maks. Paska postępu. Nie chcę czegoś takiego: http://shiny.rstudio.com/gallery/progress-example.html To, czego potrzebuję, to coś, co: 1- pokazuje komunikat o zajętości i pasek (tzn. Po prostu animowany pasek, nie trzeba pokazywać paska wypełnienia), o ile serwer oblicza 2- jest pokazywany bez względu na to, którą kartę przeglądasz. (Nie tylko w zakładce powiązanym, ale na górze tabset)

Dzięki

+0

Ten link jest martwy ... –

Odpowiedz

8

Szukałem tego jak dobrze. Większość ludzi sugerują panel warunkowy tak:

conditionalPanel(
      condition="!($('html').hasClass('shiny-busy'))", 
      img(src="images/busy.gif") 
) 

Zawsze można dać sobie więcej kontroli i stworzyć manipulację warunkowy (być może w zależności od więcej rzeczy), jak to w swoim ui.R:

div(class = "busy", 
    p("Calculation in progress.."), 
    img(src="images/busy.gif") 
) 

gdzie niektóre JavaScript obsługuje Wyświetlanie i ukrywanie tego Gr:

setInterval(function(){ 
    if ($('html').attr('class')=='shiny-busy') { 
    $('div.busy').show() 
    } else { 
    $('div.busy').hide() 
    } 
},100) 

z jakimś dodatkowym css można upewnić się, że zajęty animowany obraz dostaje stałą świetnym miejscu gdzie zawsze będzie widoczny.

W każdym z powyższych przypadków stwierdziłem, że warunek "błyszczący zajęty" jest nieco nieprecyzyjny i niewiarygodny: wskaźnik pokazuje się na ułamek sekundy i znika, gdy trwa obliczanie ... Znalazłem brudne rozwiązanie naprawić ten problem, przynajmniej w moich aplikacjach. Zapraszam do wypróbowania go i być może ktoś mógłby dać wgląd w to, jak i dlaczego to rozwiązuje problem.

W swojej server.R trzeba dodać dwa reactiveValues:

shinyServer(function(input, output, session) { 

    # Reactive Value to reset UI, see render functions for more documentation 
    uiState <- reactiveValues() 
    uiState$readyFlag <- 0 
    uiState$readyCheck <- 0 

następnie, w zależności renderPlot (lub inną funkcję wyjścia, gdzie obliczenia przejść dalej), należy użyć tych wartości reaktywne aby zresetować funkcja:

output$plot<- renderPlot({ 

    if (is.null(input$file)){ 
     return() 
    } 
    if(input$get == 0){ 
     return() 
    } 

    uiState$readyFlag 

    # DIRTY HACK: 
    # Everytime "Get Plot" is clicked we get into this function 
    # In order for the ui to be able show the 'busy' indicator we 
    # somehow need to abort this function and then of course seamlessly 
    # call it again. 
    # We do this by using a reactive value keeping track of the ui State: 
    # renderPlot is depending on 'readyFlag': if that gets changed somehow 
    # the reactive programming model will call renderPlot 
    # If readyFlag equals readyCheck we exit the function (= ui reset) but in the 
    # meantime we change the readyFlag, so the renderHeatMap function will 
    # immediatly be called again. At the end of the function we make sure 
    # readyCheck gets the same value so we are back to the original state 

    isolate({ 
     if (uiState$readyFlag == uiState$readyCheck) { 
      uiState$readyFlag <- uiState$readyFlag+1 
      return(NULL) 
     } 
    }) 

    isolate({plot <- ...}) 

    # Here we make sure readyCheck equals readyFlag once again 
    uiState$readyCheck <- uiState$readyFlag 

    return(plot) 
}) 
+0

dzięki. Spróbuję i dam znać wynik –

0

zajęty div pojawia się również na ułamkach sekundy do najnowszych wersji błyszczące, chociaż nie ma wyraźnych obliczenia są dzieje (to nie był problem w starszych wersjach). Shiny wydaje się być regularnie w trybie zajętości przez krótki czas. Jako rozwiązanie (uzupełniające powyższą dyskusję) można dołączyć drugą opóźnioną walidację błyszczącej, zajętej klasy html do obsługi warunkowej. Kod JavaScript-część będzie wyglądać coś takiego (przykład zawiera również czek na dwóch różnych div.busy-państw w zależności od biernej textit):

 if(($('html').attr('class')=='shiny-busy')){ 
       setTimeout(function() { 
       if ($('html').attr('class')=='shiny-busy') { 
        if($('#textit').html()!='Waiting...'){ 
         $('div.busy1').show() 
        } 
        if($('#textit').html()=='Waiting...'){ 
         $('div.busy2').show() 
        } 
       } 
       },1000) 
       } else { 
       $('div.busy1').hide() 
       $('div.busy2').hide() 
       } 
      },100) 
1

znalazłem używając fadeIn(), w przeciwieństwie do show() pomaga łagodzić to migotanie występuje:

setInterval(function(){ 
        if ($('html').attr('class')=='shiny-busy') { 
          setTimeoutConst = setTimeout(function(){ 
           $('#loading-page').fadeIn(500); 
          }, delay); 
         } else { 
          clearTimeout(setTimeoutConst); 
          $('#loading-page').hide(); 
         } 
       },10)