2014-05-01 81 views
6

http://shiny.rstudio.com/articles/scoping.html有光澤範圍的規則很好地解釋。有3個環境或層級相互嵌套:功能內,會話內和所有會話內可用的對象。使用< - 將更改您所處環境中的對象,並且將全局更改它,即所有會話。R Shiny中的環境

如果我在會話中定義了一個變量但想從函數內改變它會怎麼樣?

< - 只會改變它的功能,使其他功能不可讀取,並且< - 將改變它的所有會話。中間沒有什麼?像「只有一級」?

+0

我認爲(不確定)這句話的措辭不是很好,「<< - 」意思是「一層一層」。 –

+0

你的意思是說,在一個函數內使用<< - 應該改變函數和閃亮的會話中的變量,但不是一成不變的,即對於所有閃亮的會話?這不符合我的(小)經驗。我將有一個更詳細的外觀/實驗,並在這裏發佈結果。 – steinbock

+1

'<< - '不代表「全球」,而是「非本地」。請閱讀Yihui Xie在[本次討論]中的評論(https://groups.google.com/d/topic/shiny-discuss/sqo6Ve_kveo/discussion) –

回答

7

謝謝你的參考Stephane。如果在shinyServer()之前定義了一個對象,然後使用< - 在shinyServer()中的任何位置將更改該應用的所有實例的值。如果該對象在shinyServer()中定義,那麼< - (函數內部或外部)只會更改該應用程序實例的值。

我把一個小應用程序與一個計數器和實例ID來測試這個。運行應用程序的兩個實例以及它們之間的切換增加計數演示< <效果 -

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

感謝您的「小應用」。在不同的地方看到<<的不同效果是非常有用的。 –