Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Environments in R Shiny

At http://shiny.rstudio.com/articles/scoping.html the rules for scoping in shiny are well explained. There are 3 environments or levels nested inside each other: objects available within a function, within a session and within all sessions. Using <- will change the object within the environment you are in and <<- will change it globally i.e. for all sessions.

What if I define a variable within the session but want to change it from within a function?

<- will just change it within the function so not readable by other functions and <<- will change it for all sessions. Is there nothing inbetween? Like "just one level up"?

like image 847
steinbock Avatar asked May 01 '14 14:05

steinbock


People also ask

Does R have environments?

R Programming EnvironmentEnvironment can be thought of as a collection of objects (functions, variables etc.). An environment is created when we first fire up the R interpreter. Any variable we define, is now in this environment.

Is R Shiny difficult?

Along with Shiny elements, you can use HTML elements to stylize your content in your application. In my opinion, R Shiny is very easy to learn despite how powerful the tool is. If you're working on a side project or looking to add something to your portfolio, I highly recommend trying it out.

How can I see environment in R?

RStudio by default displays four panes: Console, Source Code, Environment/History, and Files. You can rearrange them by going to View -> Panes -> Pane Layout. You can add and remove tabs from panes by going to View and selecting/deselecting tab options listed at the bottom.

Is R Shiny different from R?

Using R, you create a user interface and server, and Shiny compiles your code into the HTML, CSS and JavaScript needed to display your application on the web.


1 Answers

Thanks for that reference Stephane. If an object is defined before the shinyServer() then using <<- anywhere within shinyServer() will change the value for all instances of the app. If the object is defined within shinyServer() then <<- (inside or outside a function) will only change the value for that instance of the app.

I put together a little app with a counter and instance ids to test this. Running two instances of the app and switching between them increasing the count demonstrates the effect of <<-

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
like image 130
steinbock Avatar answered Oct 03 '22 14:10

steinbock