2015-02-23 2 views
0

У меня проблема с использованием всплывающей подсказки в ggvis в моем приложении Shiny. Я хотел бы использовать дополнительную информацию о точечной точке ggvis, поэтому я создаю функцию, которая нужна id переменные:ggvis plot исчезает с подсказкой и checkBoxInput Shiny

add_info <- function(x) { 
    if(is.null(x)) return(NULL) 
    if (is.null(x$id)) return(NULL) 
    df2<- isolate(data) 
    df <- df2[df2$id == x$id, ] 
    paste0(df$info, 
     df$number) 
} 

Проблема начинается, когда я работаю с кнопками CheckBox в Блестящей приложении, то есть когда я отключив функцию всех кнопки, ошибки приходит:

Error in eval(substitute(expr), envir, enclos) : 
    wrong result size (2), expected 0 or 1 

Я знаю, что из-за моего условия фильтра, который исключил все данные. Но в этом случае я хочу увидеть пустой сюжет, когда я отключу все опции checkBox (например, как в линейном графике ниже). Как это сделать?

ui.R

library(shiny) 

shinyUI(fluidPage(

    titlePanel(""), 

    sidebarLayout(
    sidebarPanel(
     wellPanel(checkboxGroupInput("variable",label = "", 
         choices = list("a","b","c","d"), 
         selected = c("a"))), 
     br(),br(),br(),br(),br(),br(),br(),br(), 

     wellPanel(checkboxGroupInput("variable2",label = "", 
         choices = list("a","b","c","d"), 
         selected = c("a")))  
    ), 

    mainPanel(
     ggvisOutput("scatter_plot"), 
     ggvisOutput("line_plot") 
    ) 
) 
)) 

server.R

library(shiny) 

shinyServer(function(input, output) { 

    dataset <- reactive({ 
    df <- df1 %>% 
     filter(name %in% input$variable) 
    df 
    }) 

    data <- reactive({ 
     dataset() %>% 
     mutate(id = 1:n()) 
    }) 

    vis2 <- reactive({ 
    add_info <- function(x) { 
     if(is.null(x)) return(NULL) 
     if (is.null(x$id)) return(NULL) 
     df2 <- isolate(data()) 
     df <- df2[df2$id == x$id, ] 
     paste0(df$info,"<br>", 
      df$number) 
    } 
    data() %>% 
     ggvis(~number2, ~number, fill = ~name) %>% 
     layer_points(size := 100, 
        size.hover := 240, 
        key := ~id) %>% 
     add_tooltip(add_info,"hover") 
    }) 
    vis2 %>% bind_shiny("scatter_plot") 

    # LinePlot 
dataset_line <- reactive({ 
    df_line <- df1 %>% 
    filter(name %in% input$variable2) 
}) 

    vis <- reactive({ 

     dataset_line() %>% 
     ggvis(~number2, ~number, stroke = ~name) %>% 
     layer_lines() 

    }) 
    vis %>% bind_shiny("line_plot") 

}) 

global.R

df1 <- data.frame(name = rep(letters[1:4],each = 5), number = df1_number, number2 = df1_number2, 
        info = "info") 

df1_number <-sample(seq(1,20,0.01),20,replace = T) 
df1_number2 <-sample(seq(1,5,0.01),20,replace = T) 

ответ

2

Ваша ошибка на самом деле идет из ваш dplyrmutate звонок. Эта ошибка возвращается при попытке подсчета с n(), когда нет строк (т. Е. Пустой набор данных). Это предотвращает создание переменной id и вызывает проблемы с обратным ходом с ggvis. Чтобы исправить это, все, что вам нужно сделать, это изменить 1:n() на row_number() (спасибо @docendodiscimus за предложение). Для того, чтобы закрепить, снять dataset заявление и просто использовать следующее:

data <- reactive({ 
      df1 %>% 
      filter(name %in% input$variable) %>% 
      mutate(id = row_number()) 
     }) 

, которые должны исправить вашу проблему.

В качестве примера приведен рабочий пример.

runGist("https://gist.github.com/cdeterman/806f51c254c523f88f01") 
+1

@docendodiscimus, +1, что упрощает его еще больше! – cdeterman

+0

@ docendodiscimus, cdeterman Спасибо, ребята! – Nicolabo

+0

@ docendodiscimus, cdeterman Привет, еще раз. Я пытаюсь использовать его в своем коде прямо сейчас, но затем, когда я отключаю все варианты, я получаю сообщение об ошибке: «Ошибка в eval (substitute (expr), envir, enc): верхнее значение должно быть больше нижнего значения». Я не мог вспомнить, но, вероятно, я переустановил пакет 'dplyr'. – Nicolabo