Как данные передаются от реактивного Блестящего выражения к графику ggvis?

Я знакомлюсь с ggvis, и я стараюсь использовать его блестящим. У меня возникли проблемы с пониманием того, как ggvis получает данные из реактивного Блестящего выражения. Вот основное приложение из репозитория 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")

Блестящий начал жаловаться по строкам, что "Операция не разрешена без активного реактивного контекста". Итак, что же происходит?

Причина, по которой я спрашиваю, это то, что я хотел бы вернуть дополнительные объекты, которые я хочу использовать в 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? В этом question выход ggvis зарегистрирован функцией observe_ggvis, но, похоже, его нет в текущей версии ggvis (0.3).

Я использую ggvis версии 0.3.0.1 и блестящий 0.10.0 на R 3.1.1

Ответ 1

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 создала переходные анимации при изменении данных.

Ответ 2

Хорошо, я нашел решение в этом ответе.

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.