R Shiny中的环境

ste*_*ock 7 environment r scoping shiny

http://shiny.rstudio.com/articles/scoping.html上,很好地解释了有光泽的范围规则.有3个环境或级别彼此嵌套:函数内,会话内和所有会话中可用的对象.使用< - 将更改您所在环境中的对象,<< - 将全局更改它,即对于所有会话.

如果我在会话中定义变量但想要在函数中更改它,该怎么办?

< - 只会在函数内更改它,因此其他函数无法读取,<< - 将为所有会话更改它.中间什么都没有?就像"只是一级"?

ste*_*ock 8

感谢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"))


      ))

))
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)