r - 数据如何从 react 性 Shiny 表达式传递到 ggvis 图?

标签 r shiny ggvis

我开始熟悉 ggvis 并且我正在尝试使用它。我无法理解 ggvis 如何从 react 性 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是响应式(Reactive)表达式,它实际上是一个函数(还是它?),它的结果是一个 data.frame。但是,它作为函数通过管道传输到 ggvis。如果您尝试传递结果 data.frame 之类的
mtc() %>%  ggvis(~wt, ~mpg) %>%
layer_points() %>%
        bind_shiny("plot", "plot_ui")

Shiny 会开始提示“没有事件的 react 性上下文就不允许操作”。那么究竟发生了什么?

我问的原因是我想返回我想在 ggvis 中使用的其他对象。更准确地说,我想更改 x 和 y 轴标签,其中标签在 react 表达式中计算,如下所示:
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 对象?在此 question ggvis 输出注册为 observe_ggvis功能,但似乎在当前的 ggvis 版本(0.3)中不存在。

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

最佳答案

ggvis 可以为数据集传递“裸 react ”。执行此操作时,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 的方程),某些内容就无法更新。

您可以执行其他建议并将整个图包装在一个 react ​​式中:
reactive({
   get_rct_df %>% 
      ggvis() #rest of plotting code %>% 
      add_axis("x", title = input$title)
}) %>% bind_shiny("plot")

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

关于r - 数据如何从 react 性 Shiny 表达式传递到 ggvis 图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25011544/

相关文章:

javascript - 如何在Shiny服务器端使用DataTable行的 "selected"类?

javascript - Rcharts nvd3 二维缩放可能吗?

javascript - Shiny :在非事件 tabPanel 上更新 DT

r - 在两个数据集中的相同列和行上循环 ggplot/ggvis

r - Shiny 的 ggvis react 图

c++ - 时间序列 "forecast"来自 C++ 的 R 包

r - 使用 gc() 命令强制在 R 中运行垃圾回收

javascript - Shiny未检测到shiny :inputchanged event

r - 在 Rshiny/rcharts 中渲染后添加 highcharts 绘图带

r - ggVis : creating a plot with multiple layers on different dataset