闪亮:plot.window中的错误:需要有限的' xlim'页面加载时的值

时间:2018-01-26 14:03:41

标签: r shiny

我正在尝试在R闪亮中创建一个条形图。数据来自csv文件,并根据用户在selectInputsliderInput控件中的选择进行过滤。 当页面加载时,我收到错误:

  

plot.window中的错误:需要有限的' xlim'值。

然后,当页面完全加载时,一切正常并正常工作。 看起来第一次app运行,我传递给函数barplot的popData为null。在渲染绘图之前,我试图检查popData是否为建议here的null,但仍然得到相同的错误。当我使用selectedCountry和selectedYear的硬编码值而不是反应式表达式时,它可以正常工作,我没有得到这个初始错误是什么让我认为当第一次渲染绘图时,selectInput和sliderInput的结果可能还不可用(?) 我怎样才能解决这个问题?感谢。

ui <- fluidPage(
  titlePanel(title = h3("Population by age")),
  sidebarLayout(
    sidebarPanel(
      uiOutput("geoSelector"),
      br(),
      uiOutput("yearSlider"),
      br()
    ),
    mainPanel(
      plotOutput("barChart"),
      br()
    ))
)


server <- function(input, output) {

  data <- read.csv("data.csv")

  geo = sort(unique(data[,"GeographyName"]))
  output$geoSelector <- renderUI({
    selectInput("country", "Select country", as.list(geo)) 
  })

  minY <- min(unique(data[,"PeriodValue"]))
  maxY <- max(unique(data[,"PeriodValue"]))
  output$yearSlider <- renderUI({
    sliderInput("year", "Select year", min=minY, max=maxY, 
                value=as.integer(format(Sys.Date(), "%Y")), sep="", animate = TRUE, step=1)
  })
  selectedCountry <- reactive({input$country}) 
  selectedYear <- reactive({input$year})

  selectedData <- reactive({subset(data, GeographyName == selectedCountry() & 
                           PeriodValue == selectedYear())})
  selectedDataSorted <- reactive({selectedData()[order(selectedData()$AgeCategoryId),c(1:8)]})
  popData <- reactive({selectedDataSorted()$DataPoint})
  categ <- reactive({selectedDataSorted()$AgeCategory})

  output$barChart <- renderPlot({
    barplot(popData(),names.arg=categ(), cex.names = 0.7, border=NA,
            xlab="Age Category", ylab="Population (m)")
  })
}

shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:0)

这会解决您的问题吗?

 output$barChart <- renderPlot({
    validate(need(nrow(popData())>0, "Please select a data set"))
    barplot(popData(),names.arg=categ(), cex.names = 0.7, border=NA,
            xlab="Age Category", ylab="Population (m)")
  })