如何模块化闪亮的动态ggvis图表?

How to modularize a dynamic ggvis chart in shiny?

我的应用程序有一些图表,我想用单独的脚本绘制它们,以便更清晰 server.R,然后只包含 bind_shiny 个调用。

此外,因为我想回收我图表的一些构建块,所以我想拆分脚本以用更小的代码部分绘制图表。

没错,我有一个这样的 charts.R 文件:

chart1 <- reactive({
  cars %>% 
    ggvis(~speed) 

})

chart2 <- reactive({
  chart1 %>% layer_bars() 
})

当然不需要反应性,但在我原来的应用程序中需要。

那么,我想这样调用server.R上的图表:

library(shiny)
library(ggvis)
source("charts.R")
shinyServer(function(input, output) {

chart2 %>% 
  bind_shiny("test1", "test1_ui")
})

ui.R

library(shiny)
library(ggvis)
shinyUI(fluidPage(

  fluidRow(titlePanel("My app")),

    fluidRow(
          column(12,
                 tags$h1("hello"),
                 ggvisOutput('test1')
                 )
    )
   )
  )

我注意到,当我将所有内容都放在一个对象中时,charts.R 中的所有内容都有效,但如果我将绘制图表的函数拆分为多个部分,则情况并非如此。然而,像这样的东西是有效的

> a <-  cars %>% 
+   ggvis(~speed)
> a
Guessing layer_histograms()
Guessing width = 0.5 # range / 42
> a %>% layer_bars()

任何人都可以解释如何解决这个问题以及为什么我的两步法在 R 中有效但在 Shiny 中无效?

如果您的问题是看不到情节,那是因为在您的第二个recative 语句中,您需要将chart1 称为chart1()。换句话说,将 charts.R 更改为

Charts.R

chart1 <- reactive({
            cars %>% 
              ggvis(~speed)
 })

chart2 <- reactive({
           chart1() %>% layer_bars()
 })

如果您想了解有关反应性的更多信息,请查看 this link。