2015-02-23 56 views
0

我有一個問題,在我的Shiny應用程序ggvis中使用工具提示。我想用更多的信息有關ggvis點一點,這就是爲什麼我創建功能,需要id變量:ggvis繪圖消失與工具提示和checkBoxInput閃亮

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) 
} 

,當我在閃亮的應用即複選框按鈕,在工作的時候取消選中所有按鈕的啓動問題,錯誤出現:

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

我知道是因爲我的過濾條件排除所有的數據。但是在這種情況下,當我點擊所有checkBox選項時(如下面的Line plot),我想看到一個空的圖。怎麼做?

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 2015-02-23 14:11:37

+0

@ docendodiscimus,cdeterman謝謝你們!真的幫助! – Nicolabo 2015-02-23 14:23:25

+0

@ docendodiscimus,cdeterman嗨,再次。我現在嘗試使用它的代碼,但是當我解除所有選擇時,出現錯誤:'eval中的錯誤(替代(expr),envir,enclos):上限值必須大於下限值'。我記不清了,但可能我重新安裝'dplyr'軟件包。 – Nicolabo 2015-03-07 13:30:31