繁体   English   中英

如何将数据从反应性Shiny表达式传递到ggvis图?

[英]How is data passed from reactive Shiny expression to ggvis plot?

我正在熟悉ggvis,我正试图在闪亮中使用它。 我无法理解ggvis如何从反应性Shiny表达式中获取数据。 这是ggvis GitHub存储库的基本应用程序:

ui.R:

shinyUI(pageWithSidebar(
  div(),
  sidebarPanel(
    sliderInput("n", "Number of points", min = 1, max = nrow(mtcars),
                value = 10, step = 1),
    uiOutput("plot_ui")
  ),
  mainPanel(
    ggvisOutput("plot"),
    tableOutput("mtc_table")
  )
))

server.R:

library(ggvis)

shinyServer(function(input, output, session) {
  # A reactive subset of mtcars
  mtc <- reactive({ mtcars[1:input$n, ] })

  # A simple visualisation. In shiny apps, need to register observers
  # and tell shiny where to put the controls
  mtc %>%
    ggvis(~wt, ~mpg) %>%
    layer_points() %>%
    bind_shiny("plot", "plot_ui")

  output$mtc_table <- renderTable({
    mtc()[, c("wt", "mpg")]
  })
})

现在mtc是反应式表达式,它实际上是一个函数(或者是它?),它的结果是一个data.frame。 然而,它作为一个功能用管道传输给ggvis。 如果您尝试传递结果data.frame之类的

mtc() %>%  ggvis(~wt, ~mpg) %>%
layer_points() %>%
        bind_shiny("plot", "plot_ui")

Shiny会开始抱怨“没有活跃的反应环境就不允许操作”。 那么究竟发生了什么?

我问的原因是我想返回我想在ggvis中使用的其他对象。 更确切地说,我想要更改x和y轴标签,其中标签是在反应式表达式中计算的,如下所示:

mtc <- reactive({ list(data=mtcars[1:input$n, ],
labx = "Computed x axis label",
laby = "Computed y axis label")
   })

mtc %>% ggvis(data=data,~wt,~mpg) %>% 
    layer_points() %>%
    add_axis("x",title=labx) %>%
    add_axis("y",title=laby) %>%
    bind_shiny("plot", "plot_ui")

是否有可能以某种方式利用ggvis调用中的mtc()输出结构? 或者只能传递data.frame,然后将数据放入data.frame中?

或者是否有另一种注册ggvis对象的方法? 在这个问题中 ,ggvis输出使用observe_ggvis函数注册,但似乎它在当前的ggvis版本(0.3)中不存在。

我在R 3.1.1上使用ggvis版本0.3.0.1和闪亮0.10.0

ggvis可以传递给数据集的“裸反应”。 当你这样做时,ggvis会在数据发生变化时自动重新绘制数据,但不需要重新绘制整个图:

get_rct_df = reactive({  #code to change dataset from shiny input  )}
get_rct_df %>% ggvis() #rest of plotting code %>% bind_shiny("plot")

每次get_rct_df中的数据发生变化时,这将更新绘图中的数据点(但不会重绘整个绘图)。 这也意味着如果不重新绘制整个绘图(绘图标签,layer_model_predictions的等式),某些内容无法更新。

您可以执行其他建议并将整个图表包含在被动反应中:

reactive({
   get_rct_df %>% 
      ggvis() #rest of plotting code %>% 
      add_axis("x", title = input$title)
}) %>% bind_shiny("plot")

这将允许您更新绘图标题和绘图的其他部分。 但它也迫使ggvis在发生变化时重新绘制整个绘图,而不仅仅是重新绘制数据。 如果你测试两种方法,方法1看起来会“更平滑”; 当数据发生变化时,ggvis内置了过渡动画。

好的,我在这个答案中找到了解决方案。

mtc <- reactive({ list(data=mtcars[1:input$n, ],
    labx = "Computed x axis label",
    laby = "Computed y axis label")
})

reactive({
    dl <- mtc()
    dl$data %>% ggvis(data=data,~wt,~mpg) %>% 
    layer_points() %>%
    add_axis("x",title=dl$labx) %>%
    add_axis("y",title=dl$laby) 
 }) %>% bind_shiny("plot", "plot_ui")

诀窍在于评估对被动的调用,因此您可以分离ggvis和实际ggvis绘图的计算数据的过程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM