Существуют ли глобальные переменные в 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.
Ответы
Ответ 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, поскольку оператор < - только присваивает значения в локальной среде."
Я использовал это для разных уровней успеха в блестящем состоянии. Как всегда, будьте осторожны с глобальными переменными.