10

我正在熟悉 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")
  )
))

服务器.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")

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

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

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

4

2 回答 2

18

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 内置了过渡动画。

于 2014-07-31T14:06:32.213 回答
4

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

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 绘图分开。

于 2014-07-29T10:25:35.583 回答