【发布时间】: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,在...中找不到任何内容。也许这也会是一个问题? (我知道这不是您在问题中显示的警告。)