Окружающая среда в R Shiny

На http://shiny.rstudio.com/articles/scoping.html приведены правила область видимости в блестящем хорошо объяснена. Существует 3 среды или уровня, вложенные друг в друга: объекты, доступные внутри функции, внутри сеанса и во всех сеансах. Использование ‹- изменит объект в среде, в которой вы находитесь, а ‹‹- изменит его глобально, то есть для всех сеансов.

Что делать, если я определяю переменную в сеансе, но хочу изменить ее из функции?

‹- просто изменит его внутри функции, чтобы другие функции не читали его, и ‹‹- изменит его для всех сеансов. Между ними ничего нет? Типа "всего на один уровень выше"?


person steinbock    schedule 01.05.2014    source источник
comment
Я думаю (не уверен), что это предложение неправильно сформулировано и ‹‹- скорее означает один уровень вверх.   -  person Stéphane Laurent    schedule 01.05.2014
comment
Вы имеете в виду, что использование ‹‹- внутри функции должно изменять переменную внутри функции и блестящего сеанса, но не глобально, то есть для всех блестящих сеансов? Это не связано с моим (небольшим) опытом. Я посмотрю более подробно / поэкспериментирую и опубликую результаты здесь.   -  person steinbock    schedule 02.05.2014
comment
<<- означает не глобальный, а нелокальный. Прочитайте комментарии Yihui Xie в этом обсуждении.   -  person Stéphane Laurent    schedule 02.05.2014


Ответы (1)


Спасибо за эту ссылку Стефан. Если объект определен до блестящего сервера(), то использование ‹‹- в любом месте блестящего сервера() изменит значение для всех экземпляров приложения. Если объект определен в ShinyServer(), то ‹‹- (внутри или вне функции) изменит значение только для этого экземпляра приложения.

Я собрал небольшое приложение со счетчиком и идентификаторами экземпляров, чтобы проверить это. Запуск двух экземпляров приложения и переключение между ними, увеличивая количество, демонстрирует эффект ‹‹-

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
person steinbock    schedule 02.05.2014
comment
Спасибо за ваше «маленькое приложение». Очень полезно увидеть различные эффекты ‹‹- в разных местах. - person Eduardo Bergel; 08.09.2016