【问题标题】:Shiny: Error in plot.window: need finite 'xlim' values on page load闪亮:plot.window 中的错误:页面加载时需要有限的“xlim”值
【发布时间】:2018-01-26 14:03:40
【问题描述】:

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

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

然后,当页面完全加载时,一切正常且工作正常。 看起来应用程序第一次运行时,我传递给函数 barplot 的 popData 为空。我试图在渲染图之前检查 popData 是否为空,如here 建议的那样,但仍然出现相同的错误。当我对 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)

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    这能解决您的问题吗?

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

    【讨论】:

    • 好的,非常感谢。我只更改了检查长度(而不是 nrows),现在我加载消息而不是错误,直到图表重新加载默认选择。验证(需要(长度(popData())>0,“正在加载”))
    • 太棒了!我认为 popData() 是一个 data.frame,我没有很好地阅读你的代码。很高兴您能够自己解决问题,即使我的回答存在缺陷;)
    猜你喜欢
    • 2014-02-16
    • 1970-01-01
    • 2016-11-28
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多