我正在尝试第一次Shiny
使用创建应用程序。使用模块构建应用程序,以帮助保持大型应用程序模块化。但是,默认情况下,模块不会相互通信。我想跨模块共享数据。根据文档,对象是跨模块共享数据的有用方式。golem
golem
Shiny
Shiny
golem
R6
但是,在文档中提供的示例中golem
,不清楚将R6
生成器放在哪里。根据Appsilon的说法,R6
生成器进入一个单独的.R
文件(例如logger_manager.R
),然后调用global.R
以从类中构造一个新对象:logger_manager = LoggerManager$new()
. 但是,基于- 的应用程序中没有global.R
文件。golem
Shiny
下面是golem
基于我的Shiny
应用程序的最小示例。我尝试遵循文档中提供的示例中golem
的结构,但它似乎没有跨模块共享数据:
app_ui.R
:
app_ui <- function(request) {
tagList(
# Leave this function for adding external resources
golem_add_external_resources(),
# List the first level UI elements here
fluidPage(
mod_a_ui("a_ui_1"),
mod_b_ui("b_ui_1")
)
)
}
golem_add_external_resources <- function(){
add_resource_path(
'www', app_sys('app/www')
)
tags$head(
favicon(),
bundle_resources(
path = app_sys('app/www'),
app_title = 'Test'
),
# Add here other external resources
# for example, you can add shinyalert::useShinyalert()
shinyjs::useShinyjs()
)
}
app_server.R
:
app_server <- function( input, output, session ) {
# Generate R6 Class
QuestionnaireResponses <- R6Class(
classname = "QuestionnaireResponses",
public = list(
resp_id = NULL,
timezone = NULL,
timestamp = NULL,
gender = NULL,
)
)
# Create new object to share data across modules using the R6 Class
questionnaire_responses <- QuestionnaireResponses$new()
# List the first level callModules here
callModule(mod_a_server, "a_ui_1", questionnaire_responses)
callModule(mod_b_server, "b_ui_1", questionnaire_responses)
}
mod_a.R
:
mod_a_ui <- function(id){
ns <- NS(id)
tagList(
radioButtons(inputId = "gender",
label = "What is your sex?",
choices = c("Male" = 1,
"Female" = 2),
selected = character(0))
)
}
mod_a_server <- function(input, output, session, questionnaire_responses){
ns <- session$ns
# Add time start to the output vector
timestamp <- format(Sys.time(), "%Y-%m-%d %H:%M:%OS6")
timezone <- Sys.timezone()
# Generate a survey-specific ID number
resp_id <- paste0(sample(c(letters, LETTERS, 0:9), 10), collapse = "")
# Assign values to R6 object
questionnaire_responses$resp_id <- resp_id
questionnaire_responses$timezone <- timezone
questionnaire_responses$timestamp <- timestamp
questionnaire_responses$gender <- input.gender
}
mod_b.R
:
mod_b_ui <- function(id){
ns <- NS(id)
tagList(
print("questionnaire_responses$resp_id")
)
}
mod_b_server <- function(input, output, session, questionnaire_responses){
ns <- session$ns
}
但是,不能跨模块共享数据,因为当我尝试resp_id
在模块 B(在模块 A 中生成)中打印时,我收到以下错误:
An error has occurred!
object 'questionnaire_responses' not found