2016-10-01 4 views
1

Hier ist ein Spielzeug-Beispiel, in dem ich eine Zahl zwischen 1 und 10 jede Sekunde zeichne, und wo ich diese Zahlen nur anzeigen möchten, wenn die Differenz zwischen der tatsächlichen Anzahl hat wird nur gezogen und die vorher gezogene Zahl ist gleich 1. Wenn also die Folge der gezogenen Zahlen ist: [5,7,8,2,3]. Ich möchte sukzessive anzeigen [8,3]. Ich denke, es geht nur um reaktive Werte und isoliere Funktion, aber ich konnte nicht realisieren, was ich wollte. Meine gescheiterten Versuche in Kommentaren.R Shiny: Speichere vorherigen reaktiven Wert während der Verwendung von reactiveTimer

library(shiny) 


ui <- shinyUI(fluidPage(
    mainPanel(
    textOutput("time"), 
    textOutput("num") 
) 
)) 

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

    autoInvalidate <- reactiveTimer(1000) 
    timestamp<-reactive({ 
    autoInvalidate() 
    Sys.time() 
    }) 

    random_num<-reactive({ 
    autoInvalidate() 
    sample(x=seq(1,10),size = 1,replace = FALSE,pro) 
    }) 

# My attempt : obviously do not work 
# values <- reactiveValues(old=1) 
# observe({ 
#  if (random_num()==values$old) {values$display=random_num()} 
#  else {values$old=random_num()} 
# }) 

    output$time <- renderText({paste("time :",timestamp())}) 
    output$num <- renderText({paste("num :",random_num())}) 
    #My attempt : obviously do not work 
    # output$num <- renderText({paste("num :",isolate(values$display))}) 
} 

shinyApp(ui, server) 

Ich weiß, dass es eine question ist, die wie zu Mine aussieht, aber es ist ganz anders.

+0

Sie können ein "reactiveValues" -Objekt verwenden. Es ist essentiell eine Liste, die Sie aktualisieren können, wenn Ihre Bedingung mer ist, dann verwenden Sie das 'reactiveValues' Objekt in Ihrem' output $ num' – Benjamin

+0

Ja, aber eigentlich habe ich versucht zu tun, was Sie empfohlen, wie Sie in den Kommentaren der sehen können Code, aber ich habe versagt. Ich könnte etwas verpassen. –

+0

Genau wie in Ihrer verknüpften Frage können Sie entweder eine globale Variable oder ein 'reactiveValues'-Objekt verwenden. –

Antwort

3

Hier ist ein Beispiel.

library(shiny) 

old <- NULL 

ui <- shinyUI(fluidPage(
    mainPanel(
    textOutput("time"), 
    textOutput("num"), 
    textOutput("num_raw") 
) 
)) 

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

    autoInvalidate <- reactiveTimer(1000) 

    timestamp<-reactive({ 
    autoInvalidate() 
    Sys.time() 
    }) 

    random_num<-reactive({ 
    autoInvalidate() 
    r <- sample(x=seq(1,10),size = 1,replace = FALSE) 
    }) 

    observe({ 
    output$time <- renderText({paste("time :",timestamp())}) 
    r <- random_num() 
    if (!is.null(old) && r - old == 1) { 
     output$num <- renderText({paste("num :",r)}) 
    } 
    output$num_raw <- renderText({paste("raw num : ", r)}) 
    old <<- r 
    }) 

} 

shinyApp(ui, server) 
+0

Super! Nun, es scheint, dass ich die Antwort auf die verknüpfte Frage nicht gut verstanden habe. Danke vielmals! –

+0

Es gibt immer noch eine kleine Sache, die ich nicht bekomme. Warum zum Teufel ist dieses "<< -" statt "<-" ?? –

+0

Es wird verwendet, um globalen Variablen Werte zuzuweisen. Siehe http://shiny.rstudio.com/articles/scoping.html –

Verwandte Themen