Как переключить layer_model_predictions() в графике ggvis (с R и Shiny) на основе ввода пользовательского интерфейса

Я работал с ggvis в R, чтобы сделать приложение Shiny. У меня возникли проблемы с включением опции «переключение» для включения линейной модели поверх некоторого интерактивного графика.

Я воссоздал минимальный рабочий пример (который отражает мое собственное, более сложное приложение) из базового рабочего примера здесь. Мое расширение от этого, чтобы обычно включать линейную модель, работает нормально:

library(shiny)
library(ggvis)
library(ggplot2)

runApp(list(

  ui = bootstrapPage(
    ggvisOutput("plot"),
    uiOutput("plot_ui")
  ),


  server = function(..., session) {
    mtc <- mtcars
    mtc$id <- 1:nrow(mtc)

    all_values <- function(x) {
      if(is.null(x)) return(NULL)
      row <- mtc[mtc$id == x$id, ]
      paste0(names(row), ": ", format(row), collapse = "<br />")
    }

      mtc %>% ggvis(x = ~wt, y = ~mpg) %>%
        layer_model_predictions(model = "lm", se = TRUE, opacity:= 0.3) %>%
        layer_points(key := ~id) %>%
        add_tooltip(all_values, "hover") %>%
        bind_shiny("plot", "plot_ui")  }))

(Хотя меня беспокоит, что я не могу избавиться от текста при наведении на layer_model_predictions(), это менее неприятная косметическая проблема).

Я пробовал варианты этой настройки, например:

library(shiny)
library(ggvis)
library(ggplot2)

runApp(list(

  ui = bootstrapPage(
    ggvisOutput("plot"),
    uiOutput("plot_ui"),
    selectInput("radio2", "Linear Fit",
                list("Off" = "Off",
                     "On" = "On"))
  ),


  server = function(..., session) {
    mtc <- mtcars
    mtc$id <- 1:nrow(mtc)

    all_values <- function(x) {
      if(is.null(x)) return(NULL)
      row <- mtc[mtc$id == x$id, ]
      paste0(names(row), ": ", format(row), collapse = "<br />")
    }

    reactive({ if (input$radio2=="On"){
      mtc %>% ggvis(x = ~wt, y = ~mpg) %>%
        layer_model_predictions(model = "lm", se = TRUE, opacity:= 0.3) %>%
        layer_points(key := ~id) %>%
        add_tooltip(all_values, "hover") %>%
        bind_shiny("plot", "plot_ui") }  })

    reactive({ if (input$radio2=="Off"){
      mtc %>% ggvis(x = ~wt, y = ~mpg) %>%
        #### layer_model_predictions(model = "lm", se = TRUE, opacity:= 0.3) %>%
        layer_points(key := ~id) %>%
        add_tooltip(all_values, "hover") %>%
        bind_shiny("plot", "plot_ui") } })
  }
))

... в котором сюжет пропадает совсем, но без ошибок/предупреждений, поэтому мне непонятно, почему он пропадает.

Я пробовал несколько других вещей, например

  1. Перемещение операторов реактивности и if в разные места кода (например, в блок кода построения графика ggvis), но не удалось заставить это работать лучше.

  2. Я попытался передать opacity:=input$value линейной модели, чтобы я мог включать и выключать видимость линейной модели (что немного хакерски, так как оно не полностью решить вопрос). Я пробовал opacity:=reactive({ as.numeric(input$value) }), где input$value равно 0 или 100. Когда я пробовал это, я получаю сообщение об ошибке «объект 'input' не найден" , что заставляет меня задаться вопросом, есть ли какое-то дополнительное препятствие для передачи ввода пользовательского интерфейса в график на основе ggvis (?).

Мне было трудно найти решение этой конкретной проблемы в другом месте. Я был бы рад услышать любые мысли или предложения или альтернативные подходы.

Информация о версии: я запускаю Yosemite на своем Mac с R 3.2.0 («Полный состав») и использую RStudio 0.99.441. Кроме того, ggplot2_1.0.1, ggvis_0.4.1 и shining_0.12.0.


person anon82    schedule 04.06.2015    source источник