Подтвердить что ты не робот

Существуют ли глобальные переменные в R Shiny?

Как вы объявляете глобальные переменные с помощью R Shiny, чтобы вам не нужно было запускать одни и те же фрагменты кода несколько раз? В качестве очень простого примера у меня есть 2 графика, которые используют одни и те же точные данные, но я хочу только рассчитать данные ONCE.

Вот файл ui.R:

library(shiny)

# Define UI for application that plots random distributions 
shinyUI(pageWithSidebar(

# Application title
headerPanel("Hello Shiny!"),

# Sidebar with a slider input for number of observations
sidebarPanel(
sliderInput("obs", 
            "Number of observations:", 
            min = 1,
            max = 1000, 
            value = 500)
  ),

# Show a plot of the generated distribution
 mainPanel(
   plotOutput("distPlot1"),
  plotOutput("distPlot2")
 )
))

Вот файл server.R:

library(shiny)

shinyServer(function(input, output) {

  output$distPlot1 <- renderPlot({ 
    dist <- rnorm(input$obs)
    hist(dist)
  })

  output$distPlot2 <- renderPlot({ 
    dist <- rnorm(input$obs)
    plot(dist)
  })

})

Обратите внимание, что оба output$distPlot1 и output$distPlot2 делают dist <- rnorm(input$obs), которые дважды повторяют один и тот же код. Как сделать вектор "dist" пробегающим один раз и сделать его доступным для всех функций renderplot? Я попытался поставить dist вне функций, например:

library(shiny)

shinyServer(function(input, output) {

  dist <- rnorm(input$obs)

  output$distPlot1 <- renderPlot({ 
    hist(dist)
  })

  output$distPlot2 <- renderPlot({ 
    plot(dist)
  })

})

Но я получаю сообщение об ошибке, что объект dist не найден. Это пример игрушек в моем реальном коде. У меня есть 50 строк кода, которые я вставляю в несколько "Render...". Любая помощь?

О да, если вы хотите запустить этот код, просто создайте файл и запустите его:   библиотека (блестящие)   getwd()   runApp ( "C:/Desktop/R Projects/testShiny" )

где "testShiny" - это название моего проекта студии R.

4b9b3361

Ответ 1

Эта страница на блестящей веб-странице объясняет видимость переменных Shiny.

Глобальные переменные могут быть помещены в server.R (в соответствии с ответом Рикардо) или в global.R.

Объекты, определенные в global.R, аналогичны объектам, определенным в server.R за пределами shinyServer(), с одним важным отличием: они также видны для кода в ui.R. Это связано с тем, что они загружаются в глобальную среду сеанса R; весь R-код в приложении Shiny запускается в глобальной среде или его дочернем элементе.

На практике существует много раз, когда необходимо обмениваться переменными между server.R и ui.R. Код в ui.R запускается один раз, когда запускается приложение Shiny, и он генерирует HTML файл, который кэшируется и отправляется каждому подключаемому веб-браузеру. Это может быть полезно для установки некоторых общих параметров конфигурации.

Ответ 2

Как упоминалось в ссылке, приведенной выше, @nico, вы также можете использовать < классификатор внутри своих функций, чтобы сделать переменные доступными вне функции.

foo <<- runif(10)

вместо

foo <- runif(10)

Ссылка говорит: "Если объекты меняются, то измененные объекты будут видны в каждом сеансе пользователя. Но обратите внимание, что вам нужно будет использовать оператор < < - присваивание для изменения bigDataSet, поскольку оператор < - только присваивает значения в локальной среде."

Я использовал это для разных уровней успеха в блестящем состоянии. Как всегда, будьте осторожны с глобальными переменными.