Shiny框架中moduleServer无...参数时如何向模块函数传递额外参数
背景说明
根据官方文档说明:
注意:从Shiny 1.5.0版本开始,我们推荐使用
moduleServer()替代callModule(),因为它的语法更易理解,且使用moduleServer创建的模块可以通过testServer()进行测试。
以下是callModule的官方文档说明:
用法
callModule(module, id, ..., session = getDefaultReactiveDomain())参数说明
- module:Shiny模块服务端函数
- id:与调用模块UI函数时使用的ID对应的ID字符串
- ...:传递给模块服务端函数的额外参数
- session:用于创建子作用域的会话,几乎所有场景下都应使用默认值
以下是moduleServer的官方文档说明:
用法
moduleServer(id, module, session = getDefaultReactiveDomain())参数说明
- id:与调用模块UI函数时使用的ID对应的ID字符串
- module:Shiny模块服务端函数
- session:用于创建子作用域的会话,几乎所有场景下都应使用默认值
问题解答
moduleServer没有设计...参数是官方刻意调整的设计,更推荐通过闭包捕获的方式传递额外参数,比原来callModule的...传参逻辑更清晰,不容易出现参数匹配错误。
常用的实现方式有两种:
方法1:调用时封装匿名函数传参
如果不想修改原有适配callModule的模块服务端代码,直接在调用moduleServer时包一层匿名函数,将额外参数传入原有模块函数即可:
# 原有适配callModule的模块服务端代码 oldModuleServer <- function(input, output, session, param1, param2) { # 原有模块逻辑 } # 调用moduleServer时传递额外参数 p1 <- 123 p2 <- "自定义参数" moduleServer( id = "my_module", module = function(input, output, session) { oldModuleServer(input, output, session, param1 = p1, param2 = p2) } )
方法2:封装带参数的模块构造函数(官方推荐)
直接将模块服务端封装为带参数的构造函数,调用逻辑和模块UI的调用逻辑完全对齐,可读性更高,也完全兼容testServer测试:
# 定义带额外参数的模块服务端构造函数 newModuleServer <- function(id, param1, param2) { moduleServer(id, function(input, output, session) { # 模块内可以直接使用param1、param2参数 output$show_param <- renderText({ paste0("参数1:", param1, ",参数2:", param2) }) # 其余模块逻辑 }) } # 调用方式和模块UI一一对应,参数传递逻辑清晰 newModuleUI("my_module") newModuleServer("my_module", param1 = 123, param2 = "自定义参数")
内容的提问来源于stack exchange,提问作者Bear Bile Farming is Torture
相关产品推荐
相关产品推荐

