2015-01-14 9 views
6

Ich baue eine App mit mehreren Tabs auf, von denen einige übermäßige Berechnungen und andere schnell berechnen. Eine Checkbox, die es dem Benutzer erlauben würde, in Kombination mit einem "Refresh" -Button zwischen Reaktivität oder manueller Aktualisierung zu wählen, wäre ideal.Glänzend: Reaktivität kann vom Benutzer wählbar sein

Das folgende einfache Beispiel veranschaulicht, was ich anstrebe. Es funktioniert fast, abgesehen von einer letzten Aktualisierung, wenn das Kontrollkästchen "Automatisch aktualisieren" deaktiviert ist. Das ist ein Problem, sollte ein rechenintensiver Tab geöffnet sein. Gibt es einen Weg dazu?

ui.r

library(shiny) 
shinyUI(fluidPage(
    titlePanel("Test"), 
    sidebarLayout(
     sidebarPanel(
      checkboxInput("autoRefresh", "Automatically refresh", TRUE), 
      actionButton("refresh", "Refresh!"), 
      radioButtons("choice", "Choice of value:", 
       c("10" = 10, 
       "20" = 20)) 
      ), 

     mainPanel(
      tabsetPanel(type = "tabs", 
       tabPanel("Add random decimals to value", textOutput("value")) 
      ) 
     ) 
    ) 
)) 

server.r

library(shiny) 
shinyServer(function(input, output) { 
    output$value <- renderText({ 

     input$refresh 
     if(input$autoRefresh == 1) { 
      input$choice 
     } 
     isolate({ 
      output <- runif(1,0,1) + as.numeric(input$choice) 
     }) 
    }) 
}) 

Vielen Dank im Voraus!

Antwort

2

Bei dieser Lösung ich zwei Beobachter gemacht: eine für, wenn der refresh Taste getroffen wird und eine zweite für wenn choice geändert wird. Der erste aktualisiert immer die Ausgabe.

Die zweite prüft den Status input$autoRefresh und dann entweder beendet oder aktualisiert die renderText.

Leider müssen Sie den Befehl runif zweimal geschrieben haben, was für die Aktualisierung Ihres Codes schlecht sein kann (einfacher Fehler einzuführen, wenn Sie etwas zweimal machen). In der Praxis möchten Sie vielleicht eine neue Funktion erstellen und diese Funktion dann aufrufen, wenn dies ein komplexer/mehrzeiliger Prozess in Ihrer tatsächlichen App ist.

shinyServer(function(input, output) { 
    observe({ 
     input$refresh 
     output$value<-renderText({ 
     isolate(runif(1,0,1) + as.numeric(input$choice)) 
     }) 
     }) 
    observe({ 
     input$choice 
     output$value<-if(input$autoRefresh==0) return() else { 
      renderText({isolate(runif(1,0,1) + as.numeric(input$choice))}) 
     } 
    }) 
    }) 
+0

Tippfehler: Refesh. Wichtiger jedoch, das funktioniert nicht. Es wird aktualisiert, wenn das Kontrollkästchen deaktiviert ist. Dies liegt daran, dass es nicht so funktioniert, wie Sie es erklären ... die "if" -Anweisung wird erst eingegeben, wenn das Ändern von input $ choice die Ausführung des gesamten renderText() - Blocks auslöst. – hedgedandlevered

+0

@hedgedandlevered Danke! aktualisierte die Antwort. –

+0

Dieser Code funktioniert jetzt. –

2

Sie könnten die Ausgabe-Cache und Shortcut-zurückgeben, wenn entsprechende

library(shiny) 
shinyServer(function(input, output) { 
    output$value <- renderText({ 

    input$refresh 
    if(input$autoRefresh == 1) { 
     input$choice 
    } else return(cachedOutput) 
    isolate({ 
     cachedOutput <<- output <- runif(1,0,1) + as.numeric(input$choice) 
    }) 
    }) 
}) 
+0

Schöne Idee! Mit dem obigen Code funktioniert die manuelle Aktualisierung jedoch nicht, da cachedOutput immer zurückgegeben wird, wenn $ autoRefresh == 0 eingegeben wird. – mholopai

+0

Ich erkannte, dass Caching in einem anderen Teil meiner App nützlich sein kann, wo manchmal nur ein Teil einer Tabelle neu berechnet werden muss . Dies wird sich als nützlich erweisen, danke! – mholopai

Verwandte Themen