Я работал с 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") } })
}
))
... в котором сюжет пропадает совсем, но без ошибок/предупреждений, поэтому мне непонятно, почему он пропадает.
Я пробовал несколько других вещей, например
Перемещение операторов реактивности и if в разные места кода (например, в блок кода построения графика ggvis), но не удалось заставить это работать лучше.
Я попытался передать 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.