0%

Shiny Modules Reference Resoures

推荐三篇关于Shiny module使用技巧的博文,相比shiny官网中的module相关教程,其更加深入的介绍了一些用法(PS. 是一家名为ArData的公司写的,其有open source里有几个R包蛮有名的--officer包和flextable包):

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结合在一起:

  1. 先在app.R中初始化一个变量,然后传到module中
  2. 在module中修改变量,然后输出到app.R中
  3. 在app.R中再进行调用

4. 假如我想在几个modules中相互传递reactive value

这个等于将前面的app.R换个另外一个module.R,然后按照方法1,方法2或者方法3进行处理


如果以上描述的不够清楚,可去原文章中查看,其中也有不少例子,值得学习看看~

比如:

本文出自于http://www.bioinfo-scrounger.com转载请注明出处