我的ggvis图取决于几个输入字段,它们像输入数据的过滤器一样工作。对于某些组合,结果数据框为空,ggvis抛出错误并中断整个应用程序。 我试着把
if(nrow(inputdataframe) == 0) return NULL
if(nrow(inputdataframe) == 0) return ggvis()
没有帮助。在这种情况下,什么是正确的返回参数(我想要一个空图或一些文本消息)?
server.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)这令人困惑
答案 0 :(得分:4)
因此,在代码中查看更多逻辑会很有帮助。我想我总体上说,理解反应式表达在程序逻辑的上下文中是如何工作的,这一点非常重要。我尽量在闪亮的主页上阅读尽可能多的代码。这是我写的一个快速脚本,我认为得到你所要求的。干杯。
Global.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))
Server.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")
)
)
)
)
答案 1 :(得分:3)
在我的情况下,使用最新的闪亮,我可以发送一个空的data.table(或data.frame)和闪亮的只是绘制一个空图(data.frame或data.table必须有相应的列)