shinydashboard ui.R и server.R не читают Global.R

Мне удалось использовать global.R для передачи данных в ui.r и server.R при разработке в RStudio. Однако, когда я переношу свой код на сервер, ни ui.R, ни server.R не могут читать global.R. Я использую Shiny Server (не профессиональный). Что может быть причиной этого?

Мой код выглядит так (он не реагирует)

#global.R
x = 10

#ui.R
print(x)
> 10 #in RStudio viewer
> Error: object 'x' not found #on Shiny Server

Следуя приведенному ниже ответу sigmabeta, я внес изменения в server.R и global.R, однако я ищу, чтобы сервер сбросил x на другое значение, чтобы его можно было прочитать ui.R. Это то, что мой код сейчас

#global.R
x = 10
get_x_value <- function (n) {
x = n+1        
return x
}

#server.R
source("./global.R")

shinyServer(function(input, output) {
values <- reactiveValues()
observe ({
    values$x <- get_x_value(5)
})
})

#ui.R
print(x)
> 6 #in RStudio viewer
> 10 #on Shiny Server

Это фактический код в ui.R, где я пытаюсь установить состояние поля на основе значений, уже вычисленных в server.R

library(shinydashboard)
dashboardPage(
  Header = dashboardHeader(title = 'Test'), 
  Sidebar = dashboardSidebar
  (
  sidebarMenu
  (
  menuItem("ABC", tabName = "ABC")
  )
  ),
  Body = dashboardBody
  (tabItems
  (
  tabItem(
    tabName = "ABC",
    fluidRow
    (
    box
    (
    status = if (x==6) "info" else "danger" ,
    solidHeader = TRUE
    )
    )
  )
  )
  )
)

person earthlink    schedule 23.09.2016    source источник


Ответы (1)


Кажется, вы не упомянули свое блестящее приложение, которое должно получать значения (и / или) функции из global.R

Вы можете сделать это в файле server.R. Пример кода server.R:

library(shiny)

source("./global.R")

shinyServer(function(input, output) {
values <- reactiveValues()
observe ({
    values$x <- get_x_value()
})
output$text1 <- renderText({
   values$x
})

})

А затем в global.R у вас будет функция get_x_value примерно так:

get_x_value <- function () {
    x = 10
    return x
}

x также может быть определен снаружи, и вы можете захотеть выполнить некоторую дополнительную обработку, если таковая имеется в функции, или написать более сложные функции.

Обновление: добавление кода для ui.R

shinyUI(fluidPage(
mainPanel(
    htmlOutput(
        textOutput("text1")
    )
))
person Syamanthaka    schedule 29.09.2016
comment
Спасибо. Это помогло. Однако с этим решением я не могу обновить никакую переменную в global.R с server.R - person earthlink; 29.09.2016
comment
Тогда вам нужно использовать реактивные значения. Я отредактирую свой ответ, чтобы объяснить, как это можно сделать реактивно. - person Syamanthaka; 30.09.2016
comment
Я все еще не могу обновить x с сервера. Я отредактировал свой вопрос, чтобы показать, что я ищу. - person earthlink; 30.09.2016
comment
Я отредактировал, чтобы включить код ui.R. Я предполагаю, что вы уже прочитали руководства для блестящего. Если нет, см. shiny.rstudio.com/tutorial. - person Syamanthaka; 03.10.2016
comment
Спасибо еще раз. Однако конечным использованием x является не отображение его, а изменение статуса других объектов, например, изменение цвета информационного окна в shinydashboard. - person earthlink; 04.10.2016
comment
Вам нужно немного изменить логику. Сделайте переменную состояния входным параметром (скажем, Select Input), а затем сделайте ее скрытой, чтобы пользователь не мог ее видеть. Установите значение по умолчанию, например, «опасность». Затем на сервере выполните что-то вроде наблюдения ({updateSelectInput ()}) и передайте значение x, которое вы получаете из вашей функции get_value_x (). Надеюсь, это дает вам достаточно указаний. - person Syamanthaka; 06.10.2016
comment
Этот ответ кажется неправильным - почему требуется явный источник (...)? Но это работает. - person Josiah Yoder; 13.06.2019
comment
@JosiahYoder, как еще, по вашему мнению, мы можем ссылаться на внешний файл, в котором есть функции, которые вы хотите использовать в основном коде? - person Syamanthaka; 19.07.2019
comment
@sigmabeta Мое несогласие не столько с ответом, сколько с библиотекой Shiny. Почему это не задокументировано во введении в макеты модулей Shiny?? Я согласен, что код самодокументируется, но хотелось бы, чтобы на связанной странице R это было сказано. - person Josiah Yoder; 24.07.2019
comment
В этой статье фактически говорится об обратном: этот источник не необходим. Возможно, нужен ли исходник (global.R) для смены одной версии Shiny на другую? - person Josiah Yoder; 24.07.2019
comment
@JosiahYoder, если у вас есть модули, написанные в отдельном файле модуля и не включающий весь код модуля в server.R или ui.R, как бы вы сослались на этот файл в этих скриптах? В python используется импорт ‹foo›, в R - source ‹foo›. OP в этом случае только что назвал foo как global.R. - person Syamanthaka; 30.07.2019
comment
Вам не нужно исходить global.R, он просто должен находиться в том же каталоге, что и server.R и ui.R. Обратите внимание, что shinyApp вызовы не могут сплетать global.R и app.R вместе; однако это делается автоматически через shinyAppDir .. cf. ?shinyApp и stackoverflow.com/questions/54914541/global- r-dont-start / - person Jabro; 25.03.2021