推荐三篇关于Shiny module使用技巧的博文,相比shiny官网中的module相关教程,其更加深入的介绍了一些用法(PS. 是一家名为ArData的公司写的,其有open source里有几个R包蛮有名的--officer包和flextable包):
- Shiny Modules (part 1) : Why using modules ?
- Shiny Modules (part 2): Share reactive among multiple modules
- Shiny Modules (part 3): Dynamic module call
Shiny module的好处这里不做介绍了,确实很好用~但是我们在使用中会遇到一个问题,按照我们初始的想法,各个modules是被app.R
所调用的;那如果各个modules之间有些ui或者reactive相互有影响(或者说调用),那么该如何实现呢?
Shiny官方对于此问题也写了个tutorial:Communication between modules,但是个人觉得讲的并不是太完整,不如上述中的Shiny Modules (part 2)更加好理解~
我也简单记录下modules之间可以如何进行连接。。。
比如我在mod_xx.R
中写了mod_xx_ui()
和mod_xx_server()
两个函数,那么按照常见的module用法,在app.R
中按照以下方式调用即可
ui <- fluidPage(
......
mod_xx_ui("xx_ui_1")
)
server <- function(input, output, session) {
......
callModule(mod_xx_server, "xx_ui_1")
}
1. 假如我想将module中某个reactive value传递到app.R中
先在module中用reactiveValues
初始化一个toReturn
# 在 mod_xx.R 中
toReturn <- reactiveValues(
variables = NULL
)
然后将一些所需values赋值到variables变量上
# 在 mod_xx.R 中
observeEvent({
toReturn$variable <- input$test
})
最后在app.R中调用,前提先callModule
# 在 app.R 中
res <- callModule(mod_xx_server, "xx_ui_1")
observe({
print(res$variable)
})
2. 假如我想将app.R中某个reactive value传递到module中
先在app.R中用reactiveValues初始化一个变量rv
# 在 app.R 中
rv <- reactiveValues(variable = NULL)
observe({
rv$variable <- input$test
})
接着在callModule时将rv$variable
作为一个参数传入模块中
# 在 app.R 中
callModule(mod_xx_server, "xx_ui_1", variable = rv$variable)
或者直接传入reactive variable
# 在 app.R 中
callModule(mod_xx_server, "xx_ui_1", variable = reactive(input$test))
最后在module中调用variable()
即可
# 在 mod_xx.R 中
observe({
print(variable())
})
3. 假如我想将app.R中某个reactive value传递到module中,然后在module中做了一些计算后再传到app.R中
这个相当于把前面方法1和方法2结合在一起:
- 先在app.R中初始化一个变量,然后传到module中
- 在module中修改变量,然后输出到app.R中
- 在app.R中再进行调用
4. 假如我想在几个modules中相互传递reactive value
这个等于将前面的app.R换个另外一个module.R,然后按照方法1,方法2或者方法3进行处理
如果以上描述的不够清楚,可去原文章中查看,其中也有不少例子,值得学习看看~
比如:
本文出自于http://www.bioinfo-scrounger.com转载请注明出处