【问题标题】:ggvis plot disappears at random Shinyggvis 情节随机消失
【发布时间】:2015-03-07 14:28:12
【问题描述】:

我在 Shiny 中有一个奇怪的问题。我闪亮的应用程序有一个带有layer_points() 的 ggvis 图和几个操作图的选项。当我运行我的应用程序时,即使我更改了所有选项,有时一切正常,但有时(我想没有特定的规则)情节会消失。当我更改其中一个选项时,情节又回来了,但这并不酷。 我研究了这个issue,但我真的不知道它是否可以解决我的问题。 当情节消失时,我的 Shiny 应用看起来像:

这是我的代码:

ui.R

library(ggvis)
library(markdown)
library(shiny)
library(dplyr)
library(magrittr)

shinyUI(
    fluidPage(
      h3("Title"),
      fluidRow(
        column(3,
               wellPanel(
                 radioButtons("radio",h5("Select"),choices=list("All values","Selected values"),
                              selected="All values"),

                 conditionalPanel(
                   condition = "input.radio != 'All values'",
                   checkboxGroupInput("checkGroup",label = "",
                                      choices,
                                      selected = c("AT1","AT2"))
                 ),
                 hr(),
                 radioButtons("dataset", label = h5("Drilldown"),
                              choices = list("2 Level" = "df1", "3 Level" = "df2")

                 ),
                 hr(),
                 h5("Choice"),
                 selectInput("xvar", h6(""), 
                             axis_vars_x,
                             selected = "value"),
                 selectInput("yvar", h6(""), 
                             axis_vars_y,
                             selected = "number2"),
                 hr(),
                 uiOutput("slider")
               )
        ),
        column(9,
               ggvisOutput("plot")
        )
      )

    )
  )

server.R

library(shiny)

shinyServer(function(input, output,session) {

  datasetInput <- reactive({
    switch(input$dataset,
           df2 = df2,
           df1 = df1)
  })

  axis_vara_y <- reactive({
    switch(input$yvar,
           number = 2,
           number2 = 3)
  }) 


  output$slider <- renderUI({
    sliderInput("inslider",h5(""), min   = round(min(datasetInput()[,axis_vara_y()]),0)-1, 
                max   = round(max(datasetInput()[,axis_vara_y()]),0)+1,
                value = c(round(min(datasetInput()[,axis_vara_y()]),0)-1, 
                          round(max(datasetInput()[,axis_vara_y()]),0)+1),
                step  = 0.5)
  })

  data <- reactive({
    filteredData <- datasetInput()
    axisData <- axis_vara_y()

    if(!is.null(input$inslider)){
      if(input$radio == "All values"){
        filteredData <- filteredData %>%
          filter(filteredData[,axisData] >= input$inslider[1],
                 filteredData[,axisData] <= input$inslider[2])
      }
      else {
        filteredData <- filteredData %>%
          filter(value %in% input$checkGroup,
                 filteredData[,axisData] >= input$inslider[1],
                 filteredData[,axisData] <= input$inslider[2])
      }
    }
    return(filteredData)
  })  

  data_point <- reactive({
    data() %>%
      mutate(id = row_number())

  })

  xvar <- reactive(as.symbol(input$xvar))
  yvar <- reactive(as.symbol(input$yvar))

  dotpoint_vis <- reactive({

      xvar_name <- names(axis_vars_x)[axis_vars_x == input$xvar]
      yvar_name <- names(axis_vars_y)[axis_vars_y == input$yvar]


    data_point_detail <- data_point()

    plot <- data_point_detail %>%
      ggvis(x = xvar(),y =  yvar()) %>%
      layer_points(size := 120,fill = ~value) %>%
      add_axis("x", title = xvar_name) %>%
      add_axis("y", title = yvar_name) %>%
      set_options(width = 750, height = 500, renderer = "canvas") 

  })
  dotpoint_vis %>% bind_shiny("plot")

})

global.R

choices <- list("Value1" = "AT1", "Value2" = "AT2",
                "Value3" = "AT3", "Value4" = "AT4",
                "Value5" = "AT5", "Value6" = "RT1",
                "Value7" = "AT6", "Value8" = "AT7",
                "Value9" = "AT8", "Value10" = "AT9",
                "Value11" = "AT10", "Value12" = "RT2")

levele <- c("AT1","AT2","AT3","AT4","AT5","RT1","AT6","AT7","AT8","AT9","AT10","RT2")

df1 <- data.frame(value = levele,number = seq(2,46,4), number2 = seq(2,24,2),order = 1:12) 

df2 <- data.frame(value = levele,number = rep(4:15), number2 = rep(4:9,each = 2),order = 1:12) 

df1$value <- factor(df1$value, levels = levele)
df2$value <- factor(df2$value, levels = levele)

axis_vars_y <- c("number","number2")
axis_vars_x <- c("value", "order","number","number2")

更新

我也不知道 ggvis 中的动画发生了什么。

【问题讨论】:

  • @cdeterman,你知道是否可以修复它吗?
  • 你更新shiny和ggvis到新版本了吗?在我更新之后,问题就消失了。
  • 没错。谢谢。

标签: r shiny ggvis


【解决方案1】:

这个问题一开始很难重现,但我发现我可以通过在所有值和选定值之间来回单击来重现它。在两个单选按钮之间切换一些次数后,图表会消失或重新出现,但它看似随机变化 - 有时需要单击 4 次才能使图表消失或重新出现,有时需要单击 2 次或单击其他次数。

bind_shiny() 或 ggvisOutput() 中一定存在错误,因为以下更改确实会创建一个似乎不会消失的图形:

在 ui.R 中,进行以下更改:

   # ggvisOutput("plot")
   plotOutput('plot')

在 server.R 中,进行以下更改:

plot(data_point_detail[ , c(input$xvar, input$yvar)], xlab=xvar_name, ylab=yvar_name)
#     plot <- data_point_detail %>%
#       ggvis(x = xvar(),y =  yvar()) %>%
#       layer_points(size := 120,fill = ~value) %>%
#       add_axis("x", title = xvar_name) %>%
#       add_axis("y", title = yvar_name) %>%
#       set_options(width = 750, height = 500, renderer = "canvas") 
#     plot

output$plot <- renderPlot(dotpoint_vis())
# dotpoint_vis %>% bind_shiny("plot")

【讨论】:

  • 显然这看起来不像你想要的那样——这只是为了表明 plotOutput() 和 renderPlot() 工作,其中 ggivisOutput() 和 bind_shiny() 不起作用。
  • 我排除了add_tooltip 代码,因为它对我来说非常重要,这就是我必须使用ggvis 的原因。所以这不是我的问题的解决方案。
  • 起初我以为问题可能是你如何使用dotpoint_vis。您将其定义为反应式,通常稍后将结果称为 dotpoint_vis(),但您省略了括号并说 dotpoint_vis %>% bind_shiny("plot")。如果你把括号放进去,你会得到一个错误。 bind_shiny 的帮助声称它可以接受反应式表达式,但为避免该错误,您需要将其放在 observe() 中,因此 observer(dotpoint_vis() %>% bind_shiny("plot") ) 将运行,但这并没有'不解决你原来的问题。我仍然认为 bind_shiny() 中一定有一个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-14
相关资源
最近更新 更多