我有一个selectInput UI对象,并且一旦用于从下拉选项中选择一个条目,我想读取RDS文件。 selectInput
的选择是指向不同RDS
文件的路径。 UI模块可以正常工作,而服务器模块则不能。我得到input$study
,因此得到input$dataset1
,然后一旦我从input $ datasets1中选择一个条目,应用程序应开始读取RDS文件,但不会。
如何触发模块内部的eventReactive表达式运行,然后使该RDS
文件可用于整个应用程序供其他模块使用?
load_sce <- function(input, output, session) {
output$sce_objects <- renderUI({
validate(need(input$study, message = FALSE))
withProgress(message = "Getting SCE objects...", {
objects <- FIND SOME FILES
ns <- session$ns
selectInput(inputId = ns("dataset1"),
label = "Select a specifc analysis",
width = "100%",
choices = c("", objects),
selected = "")
})
})
sce1 <- eventReactive(input$dataset1, {
validate(need(input$dataset1, message = FALSE))
withProgress(message = "Reading data...", { readRDS(input$dataset1) })
})
return( reactive({ sce1 }) )
}
答案 0 :(得分:0)
我将查看withProgress
和Progress
的文档。 withProgress
适用于在循环内运行的任务。 https://shiny.rstudio.com/reference/shiny/1.2.0/Progress.html
此外,请参见以下模块示例:https://shiny.rstudio.com/articles/modules.html。为了使数据框作为反应性值返回到模块外部,应将其创建为模块内部的反应性对象,然后按原样返回。另外,由于input$dataset1
是sce1
所依赖的唯一无功值,因此可以使用reactive
代替eventReactive
。 eventReactive
更适合于反应式表达式中未实际使用的按钮之类的输入,而只是将服务器用作表达式执行的触发器。
load_sce <- function(input, output, session) {
output$sce_objects <- renderUI({
validate(need(input$study, message = FALSE))
objects <- FIND SOME FILES
ns <- session$ns
selectInput(inputId = ns("dataset1"),
label = "Select a specifc analysis",
width = "100%",
choices = c("", objects),
selected = "")
})
sce1 <- reactive({
validate(need(input$dataset1, message = FALSE))
progress <- Progress$new(session, min=0, max=1)
on.exit(progress$close())
progress$set(message = 'Reading data...')
dataset1 <- readRDS(input$dataset1)
progress$set(value = 1)
return(df)
})
return(sce1)
}
答案 1 :(得分:0)
已解决
我在模块功能中使用了以下内容:
sce1 <- reactive({
validate(need(input$dataset1, message = FALSE))
withProgress(message = "Reading data...", {
dataset1 <- readRDS(input$dataset1)
}) # withProgress
return(dataset1)
}) # reactive
return(sce1)
并使用以下命令在主应用程序中调用该模块:
sce1 <- callModule(load_sce, "load_sce_explore")
现在,我可以将sce1
作为函数参数传递给其他模块(使用sce1
而不是sce1()
)或在主应用程序的其他代码段中使用它(但在这种情况下)使用sce1()
)。
谢谢