【问题标题】:ggvis plot disappears with tooltip and checkBoxInput Shinyggvis 绘图随着工具提示和 checkBoxInput Shiny 消失
【发布时间】:2015-02-23 11:49:44
【问题描述】:

在我的 Shiny 应用程序中使用 ggvis 中的工具提示时遇到问题。我想在 ggvis 中使用关于点的附加信息,这就是为什么我创建需要 id 变量的函数:

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

当我在 Shiny 应用程序中使用复选框按钮时,问题就开始了,即当我取消单击所有按钮时,出现错误:

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

我知道这是因为我的过滤条件排除了所有数据。但在这种情况下,当我取消单击所有复选框选项时,我希望看到一个空图(如下面的线图所示)。怎么做?

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)

【问题讨论】:

    标签: r shiny ggvis


    【解决方案1】:

    您的错误实际上来自您的 dplyr mutate 电话。当您尝试在没有行(即空数据集)时使用 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")
    

    【讨论】:

    • @docendodiscimus,+1,这进一步简化了它!
    • @docendodiscimus,cdeterman 再一次嗨。我现在尝试使用它的代码,但是当我取消单击所有选项时,我得到一个错误:Error in eval(substitute(expr), envir, enclos) : upper value must be greater than lower value。我不记得了,但可能我重新安装了dplyr 包。
    • @Nicolabo,我更新了要点,以便正确加载包。之前假设您已经加载了dplyr。它现在在我的机器上运行没有错误。
    • 不,我仍然有这个错误Error in eval(substitute(expr), envir, enclos) : upper value must be greater than lower value. 在我自己添加library(dplyr) 之前。我不明白,因为 2 周前一切正常。你能看看我的 sessionInfo() 吗? gist.github.com/Nicolabo/7e07f5ce2070bc2d1fb4 –
    • @Nicolabo,它对你有用吗?当您选择值时,应用程序会显示图表吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多