【问题标题】:Proper way to return from ggvis when the data is empty?数据为空时从 ggvis 返回的正确方法?
【发布时间】:2014-09-23 14:28:59
【问题描述】:

我的 ggvis 图取决于几个输入字段,它们的作用类似于输入数据的过滤器。对于某些组合,生成的数据框为空,并且 ggvis 抛出错误并破坏整个应用程序。 我试着把

if(nrow(inputdataframe) == 0) return NULL 
if(nrow(inputdataframe) == 0) return ggvis()

这没有帮助。在这种情况下,正确的返回参数是什么(我想要一个空图或一些短信)?

服务器.R

effvis <- reactive ({
      dta <- siteeff()
      if(nrow(dta)  == 0) return(NULL)
      dta %>%
          ggvis(~param.value, ~yvar) %>%
          layer_points( size := 50, size.hover := 200) %>%
          set_options(width = 800, height = 500)
})
effvis %>% bind_shiny("effplot")

ui.R --

ggvisOutput("effplot")

更新

我不想在数据为空时显示所有数据(建议here)这很混乱

【问题讨论】:

  • 我也对此感兴趣。我只是有条件地提供具有相同列和零的 data.frame。您应该能够在 ui.R 中使用 conditionalPanel 来查看指示 data.frame 是否为空的反应字符串,但在我的情况下它并不总是有效。
  • 过去,您的“此处”链接对我很有帮助。我还会查看指向她在 cmets 中工作的应用程序的链接。你的用户界面中有输入控件吗?你应该测试那些存在于 server.r
  • @miles2know 感谢您指向 cmets。确实,我查看了她的代码,发现了我不知道的 validate() 函数 - shiny.rstudio.com/articles/validation.html 但是,它似乎对 ggvis 不起作用

标签: r shiny ggvis


【解决方案1】:

因此,在您的代码中查看更多逻辑会很有帮助。我想我会说一般来说,理解反应式表达式在程序逻辑上下文中的工作方式非常重要。我会尝试在闪亮的主页上阅读尽可能多的代码。这是我写的一个快速脚本,我认为它可以满足您的要求。干杯。

全球.r

    library(plyr)
    library(dplyr)

    exp <- data.frame(Ind=rep(c("a","b"),each=50),val1=rgamma(100,10,5),val2=rnorm(100,2,3.5))

服务器.r

    library(shiny)
    library(ggvis)

    shinyServer(function(input, output, session) {

    output$selectO <- renderUI({ selectInput(inputId="selectI", label = h4("Level to Plot"), 
        choices = list("a","b","c"),selected="a")
    })

    observe({

    if(!is.null(input$selectI)){ 

    expfilter <- reactive({
             vals <- exp %>% filter(Ind == input$selectI)
             return(vals)
    })

    if(nrow(expfilter())==0){

    fail <- reactive({ return("filter failed") })

    output$trouble <- renderText({fail()}) # notice the use of () since fail is a function. when you want to grab the values of reactives use the ()

    } else {

    success <- reactive({ return("good") })

    output$trouble <- renderText({success()})   

    P1 <- reactive({ 
        expfilter %>% ggvis(~val1, ~val2) %>% 
        add_axis("x",title="Var1",title_offset=45,properties=axis_props(labels=list(fontSize = 13, fontWeight = "bold"),title=list(fontSize = 15))) %>% 
        add_axis("y",properties=axis_props(labels=list(fontSize = 13, fontWeight = "bold")))
    })  

    P1 %>% bind_shiny("plot1")

       }
      }
     })
    })


ui.r

    library(shiny)

    shinyUI(fluidPage(
     column(3,
      wellPanel(
       uiOutput("selectO")
       )
      ),
     column(9,
      wellPanel(
       ggvisOutput("plot1")),
        wellPanel(h6("How Did the Filter Do"),
        textOutput("trouble")
       )
      )
     )
    )  

【讨论】:

  • 感谢这个 sn-p,让我意识到它本身不是 ggviz,但只有 %>%layer_smooths() 负责破坏代码如果添加 %>% layer_smooths( ) 到您的图表,您的解决方法不起作用并且应用程序中断。我提交了一个问题,但问题仍然存在 - 数据为空时如何不启动 ggvis
  • 嗨。这并不让我感到惊讶。我对你的 ggvis 代码没有任何问题,我只是把我放在周围的任何旧代码都扔进去了。在我看来,您正在尝试使用闪亮的东西,并弄清楚当您的过滤器变空时如何不让它损坏。这就是我的意思。因此,除非我误解了您,否则上面的代码提供了一条在这方面前进的道路。同样,尽管我上面的示例并不是为了展示 ggvis 本身的任何特殊内容。祝你好运。
  • observe() 函数对我来说是缺失的部分。干杯。
  • 不错的解决方案。唯一的问题是你失去了只有点移动的 ggvis “平滑过渡”,并且不必重新绘制情节。 @hadley 有什么想法吗?
  • 在我的情况下,使用最新的闪亮,我可以发送一个空的 data.table(或 data.frame),闪亮只是绘制一个空图(data.frame 或 data.table 必须有对应的列)
【解决方案2】:

在我的情况下,使用最新的闪亮,我可以只发送一个空的 data.table(或 data.frame),闪亮只绘制一个空图(data.frame 或 data.table 必须有相应的列)

【讨论】:

  • 您是否也可以使用远程dplyr 表?我无法重现该示例,因为不知道我可以使用任何公共数据库,但是当 tbl 不是本地 Error in UseMethod("prop_type") : no applicable method for 'prop_type' applied to an object of class "c('tbl_mysql', 'tbl_sql', 'tbl_lazy', 'tbl')" 时出现以下错误
  • 感谢您的回答,这是我为解决应用程序中的类似情况所做的,但我想补充一点,您必须返回一个 ggvis 对象而不是 data.frame。也许这就是你的意思,但我不得不再努力一点才能得到它,所以在重新调整 NULL 时,你必须返回一个具有相同列的空 data.frame,然后使用 dplyr 创建 ggvis data.frame(col1='',col2='') %&gt;% ggvis(~col1,~col2) %&gt;%layer_points() + 用于答案:)
猜你喜欢
  • 2015-05-31
  • 2023-03-10
  • 1970-01-01
  • 2019-12-30
  • 2013-11-23
  • 1970-01-01
  • 2017-06-17
  • 2016-05-20
  • 1970-01-01
相关资源
最近更新 更多