【问题标题】:returning Inf error in getting indices for Dates from sliderInput control R Shiny从sliderInput控件R Shiny获取日期索引时返回Inf错误
【发布时间】:2021-01-06 10:02:30
【问题描述】:

当我尝试根据用户在 sliderInput 控件中选择的日期索引在 Shiny 中对数据框进行子集化时,我不断收到以下 Inf/-Inf 错误。

Warning in min(inputData$rawdata$TmStamp) :
  no non-missing arguments to min; returning Inf
Warning in max(inputData$rawdata$TmStamp) :
  no non-missing arguments to max; returning -Inf
Warning in min(inputData$rawdata$TmStamp) :
  no non-missing arguments to min; returning Inf
Warning in max(inputData$rawdata$TmStamp) :
  no non-missing arguments to max; returning -Inf
Warning: Error in seq.int: 'to' must be a finite number

我的代码如下。我正在使用 renderUI 在服务器中渲染控件,因此它可以对 sliderInput 控件做出反应。我认为问题在于,首先,renderDataTable 函数不知道索引应该是数据帧的第 1 行和第 # 行(input$rawdata)。但是,我不知道如何解决这个问题。我怎样才能让它正常工作?我不明白为什么 raw_begin_ind 和 raw_end_ind 没有立即设置(如果这是问题的话)。谢谢。

    output$rawDateRange <- renderUI({
            tagList(
                    tags$style(type = 'text/css', '#raw_slider .irs-grid-text {color: black; font-size: 12px; transform: rotate(-90deg) translate(-20px)}'), 
                    div(id = 'raw_slider',
                        sliderInput(inputId='rawDateRange',
                                    label='Select Time Period to Show:',
                                    min = as.Date(min(inputData$rawdata$TmStamp)),
                                    max = as.Date(max(inputData$rawdata$TmStamp)),
                                    value = c(as.Date(min(inputData$rawdata$TmStamp)),as.Date(max(inputData$rawdata$TmStamp)))
                        )
                    )
            )
    })
    
    observeEvent(input$rawDateRange,
            {
                    raw_begin_ind <- min(which(substr(inputData$rawdata$TmStamp,1,10) == input$rawDateRange[1]))
                    raw_end_ind <- max(which(substr(inputData$rawdata$TmStamp,1,10) == input$rawDateRange[2]))
                    
                    output$rawdata <- renderDataTable({
                            inputData$rawdata[raw_begin_ind:raw_end_ind,]
                    })
            }
    )

【问题讨论】:

  • 您可以使用cat 在控制台中显示值以调试您的代码。例如,在 which(min(...)) 之前插入 cat(substr(inputData$rawdata$TmStamp,1,10),'\n') 以确保条件如您所想。
  • “反应性”似乎无法预测。对于一些(通常较大但并非总是)闪亮的应用程序,反应块可以在它所依赖的输入元素被实例化之前触发,因此input$... 可能是NULL 或为空,这违背了对输入预期内容的一般假设.这通常会级联,导致 0 长度(0 行)反应数据级联到后续元素。这是req(...) 非常有用的原因之一:当其输入不稳定时,它会停止反应块(以及后续依赖块)中的任何进一步工作。
  • 尝试将req(inputData$rawdata) 添加到这两个反应块的开头(第一个表达式),看看它是否可以改善问题。
  • 顺便说一句:min(which(...))which(...)[1] 的慢版本;同样max(which(...))tail(which(...),1) 的较慢版本。诚然,时间上的差异是微乎其微的。但结果不等价:min(which(...))... 条件都不为真时返回Inf;同样max(which(...)) 返回-Inf,在... 中找不到任何内容。也许这也会是一个问题? (我知道这不是您在问题中显示的警告。)

标签: r shiny


【解决方案1】:

我想我会回答我自己的问题,所以这是我用来解决问题的代码。问题的一部分是日期(下面代码中的“LDT”)列不是 POSIX 格式。另一个奇怪的问题是,没有“min”或“max” as.Date(min(input$Date....)),我仍然收到 Inf/-Inf 错误。我告诉它从哪一行获取日期,所以这是非常奇怪的行为。不管怎样,谢谢大家的帮助!

    # Date Range Input controls for raw and qc data
    output$rawDateRange <- renderUI({
            req(inputData$rawdata)
            tagList(
                    tags$style(type = 'text/css', '#raw_DateSlider .irs-grid-text {color: black; font-size: 11px; transform: rotate(-75deg) translate(-20px)}'), 
                    div(id = 'raw_DateSlider',
                        sliderInput("rawDateRange", label = "Choose Date Range to View",
                                    min = as.Date(min(inputData$rawdata$LDT[1])),
                                    max = as.Date(max(inputData$rawdata$LDT[nrow(inputData$rawdata)])),
                                    value = c(as.Date(min(inputData$rawdata$LDT[1])),as.Date(max(inputData$rawdata$LDT[nrow(inputData$rawdata)])))
                        )
                    )
            )
    })
    
    observeEvent(input$rawDateRange, {
            output$rawdata <- renderDataTable({
                    inputData$rawdata %>% filter(LDT >= input$rawDateRange[1] & LDT <= input$rawDateRange[2])
            })
    })
    
    output$qcDateRange <- renderUI({
            req(inputData$qcdata)
            tagList(
                    tags$style(type = 'text/css', '#qc_DateSlider .irs-grid-text {color: black; font-size: 11px; transform: rotate(-75deg) translate(-20px)}'), 
                    div(id = 'qc_DateSlider',
                        sliderInput("qcDateRange", label = "Choose Date Range to View",
                                    min = as.Date(min(inputData$qcdata$LDT[1])),
                                    max = as.Date(max(inputData$qcdata$LDT[nrow(inputData$qcdata)])),
                                    value = c(as.Date(min(inputData$qcdata$LDT[1])),as.Date(max(inputData$qcdata$LDT[nrow(inputData$qcdata)])))
                        )
                    )
            )
    })
    
    observeEvent(input$qcDateRange, {
            output$qcdata <- renderDataTable({
                    inputData$qcdata %>% filter(LDT >= input$qcDateRange[1] & LDT <= input$qcDateRange[2])
            })
    })

【讨论】:

    猜你喜欢
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    相关资源
    最近更新 更多