2014-05-01 15 views
6

Al http://shiny.rstudio.com/articles/scoping.html le regole per l'ambito in lucido sono ben spiegate. Ci sono 3 ambienti o livelli annidati l'uno dentro l'altro: oggetti disponibili all'interno di una funzione, all'interno di una sessione e all'interno di tutte le sessioni. Usando < - cambierà l'oggetto nell'ambiente in cui ti trovi e < < - lo cambierà globalmente, ad esempio per tutte le sessioni.Ambienti in R lucido

Cosa succede se si definisce una variabile all'interno della sessione ma si desidera modificarla da una funzione?

< - lo cambierà solo all'interno della funzione, quindi non è leggibile da altre funzioni e < < - lo cambierà per tutte le sessioni. Non c'è niente tra di loro? Come "solo un livello su"?

+0

penso (non è sicuro) questa frase non è ben formulata e "<< -" significa piuttosto "un livello su". –

+0

Intendi dire che l'uso di << - all'interno di una funzione dovrebbe cambiare la variabile all'interno della funzione e della sessione lucida ma non in modo chiaro, ad esempio per tutte le sessioni brillanti? Questo non si collega alla mia (piccola) esperienza. Avrò uno sguardo/esperimento più dettagliato e posterò i risultati qui. – steinbock

+1

'<< -' non significa "globale" ma "non locale". Leggi i commenti di Yihui Xie in [questa discussione] (https://groups.google.com/d/topic/shiny-discuss/sqo6Ve_kveo/discussion) –

risposta

7

Grazie per il riferimento Stephane. Se un oggetto viene definito prima di shinyServer(), quindi utilizzando < < - ovunque all'interno di shinyServer() verrà modificato il valore per tutte le istanze dell'app. Se l'oggetto è definito all'interno di shinyServer() allora < < - (all'interno o all'esterno di una funzione) cambierà solo il valore per quell'istanza dell'app.

Ho messo insieme una piccola app con un contatore e id di esempio per testare questo. Esecuzione di due istanze della app e il passaggio tra di loro aumentando il numero dimostra l'effetto di < < -

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

Grazie per la tua "piccola app". È abbastanza utile vedere i diversi effetti di << - in luoghi diversi. –