2014-06-10 36 views
7

Mam nadzieję, że ktoś może mi w tym pomóc.przechwytywanie wyników kotów okresowo dla błyszczącego wyjścia R (renderPrint)

Można powiedzieć, że jest to funkcja „przykład”, który jest czymś w rodzaju

##function from a package 

example<-function(f){ 
     #does something 
     cat("step 1 done....") 
     # etc etc 
     cat("step 2 done....") 
     return(some_data_frame) 
} 

##server ui code 
example2<-reactive({ 
     if(input$some_action_button==0) 
      return() 
     result<-isolate(example(input$f1)) 
     return(result) 
}) 

output$f2<-renderPrint({ 
     example2() 
}) 

Czy istnieje jakiś sposób, aby uchwycić „Cat” wyjść z funkcji w renderPrint okresowo? Zakładając, że jest to długa funkcja do przetworzenia i byłoby miło dla użytkownika, aby uzyskać trochę feedbabk. invalidateLater nie działa dla rzeczy, które są już w ramach funkcji (przynajmniej tak się wydaje, gdy próbowałem go tutaj).

Ponadto, jako dodatkowy problem, zapisanie kodu w powyższy sposób spowodowałoby, że renderPrint przechwyciłby razem zarówno "cat", jak i dane.frame, prawdopodobnie z powodu "powrotu".

Jeśli ktoś mógłby wskazać mi właściwy kierunek, byłoby to bardzo pomocne! Dzięki!

Odpowiedz

3

Po pierwsze, świetne pytanie, dużo o tym myślałem.

Ponieważ błyszcząca jest jednowątkowa, nieco trudniejsze jest przechwytywanie wyników funkcji i wyświetlanie jej w lśniącej z tego, co wiem.

Obejście tego problemu polega na użyciu nie blokującego połączenia z plikiem i uruchomieniu funkcji, z której ma zostać przechwycone wyjście w tle podczas odczytywania pliku dla funkcji wyjściowej (Sprawdź historię edycji, aby dowiedzieć się, jak to zrobić).

Innym sposobem osiągnięcia tego celu byłoby przesłanianie funkcję koci pisać na stderr (przełączając cat z message) i uchwycić wyjście funkcji takiego:

library(shiny) 
library(shinyjs) 

myPeriodicFunction <- function(){ 
    for(i in 1:5){ 
    msg <- paste(sprintf("Step %d done.... \n",i)) 
    cat(msg) 
    Sys.sleep(1) 
    } 
} 

# Override cat function 
cat <- message 

runApp(shinyApp(
    ui = fluidPage(
    shinyjs::useShinyjs(), 
    actionButton("btn","Click me"), 
    textOutput("text") 
), 
    server = function(input,output, session) { 
    observeEvent(input$btn, { 
     withCallingHandlers({ 
     shinyjs::text("text", "") 
     myPeriodicFunction() 
     }, 
     message = function(m) { 
     shinyjs::text(id = "text", text = m$message, add = FALSE) 
     }) 
    }) 
    } 
)) 

Ten przykład jest oparty głównie na this wątpliwość Daattali.

+0

Nice; ale zamień 'shinyjs :: text' na' shinyjs :: html' i argument tekstowy z komunikatem html = m $ –