2014-05-01 2 views
6

Bei http://shiny.rstudio.com/articles/scoping.html sind die Regeln für das Festlegen in glänzend gut erklärt. Es gibt drei ineinander verschachtelte Umgebungen oder Ebenen: Objekte, die innerhalb einer Funktion, innerhalb einer Sitzung und in allen Sitzungen verfügbar sind. Mit < - wird das Objekt in der Umgebung, in der Sie sich befinden, geändert und < < - ändert es global, d. H. Für alle Sitzungen.Umgebungen in R Shiny

Was passiert, wenn ich eine Variable in der Sitzung definiere, sie aber innerhalb einer Funktion ändern möchte?

< - wird nur innerhalb der Funktion ändern, so dass nicht von anderen Funktionen und < < - wird es für alle Sitzungen ändern. Gibt es nichts dazwischen? Wie "nur eine Stufe höher"?

+0

Ich denke, (nicht sicher) dieser Satz ist nicht gut formuliert und "<< -" bedeutet eher "eine Ebene höher". –

+0

Meinst du, dass die Verwendung von << - innerhalb einer Funktion die Variable innerhalb der Funktion & glänzend Sitzung ändern soll, aber nicht global, d. H. Für alle glänzenden Sitzungen? Das passt nicht zu meiner (kleinen) Erfahrung. Ich werde ein detaillierteres Aussehen/Experiment haben und die Ergebnisse hier veröffentlichen. – steinbock

+1

'<< -' bedeutet nicht "global", sondern "nicht lokal". Lesen Sie Yihui Xies Kommentare in [dieser Diskussion] (https://groups.google.com/d/topic/shiny-discuss/sqo6Ve_kveo/discussion) –

Antwort

7

Danke für diese Referenz Stephane. Wenn ein Objekt vor dem shinyServer() definiert ist, wird mit < < - überall innerhalb von shinyServer() der Wert für alle Instanzen der App geändert. Wenn das Objekt innerhalb von shinyServer() definiert ist, wird < < - (innerhalb oder außerhalb einer Funktion) nur den Wert für diese Instanz der App ändern.

Ich habe eine kleine App mit einem Zähler und Instanz-IDs zusammengestellt, um dies zu testen. Laufen zwei Instanzen der App und das Umschalten zwischen ihnen die Zählung zu erhöhen zeigt die Wirkung von < < -

ui.r

library(shiny) 

shinyUI(pageWithSidebar(

    headerPanel("Testing Environments"), 

    sidebarPanel(


    actionButton("increment_counter", "Increase Count") 


), 

    mainPanel(

    tabsetPanel(
     tabPanel("Print", verbatimTextOutput("text1")) 


    )) 

)) 

server.r

instance_id<-1000 

shinyServer(function(input, output, session) { 

    instance_id<<-instance_id+1 
    this_instance<-instance_id 

    counter<-0 


    edit_counter<-reactive({ 

    if(input$increment_counter>counter){ 
    counter<<-counter+1 
    } 

    list(counter=counter) 

    }) 



    output$text1 <- renderPrint({ 
    cat(paste("Session ID: ",Sys.getpid()," \n")) 
    cat(paste("Global Instance ID: ",instance_id," \n")) 
    cat(paste("This Instance ID: ",this_instance," \n")) 
    cat(paste("Button Value: ",input$increment_counter," \n")) 
    cat(paste("Counter Value: ",edit_counter()$counter," \n")) 


    }) 



}) # end server function 
+0

Vielen Dank für Ihre 'kleine App'. Es ist sehr nützlich, die verschiedenen Effekte von << - an verschiedenen Orten zu sehen. –