我已经使用闪亮有一段时间了,我正在尝试生成动态 UI 元素,以使我实验室中的一些人更容易进行数据分析。到目前为止,我在使基本功能正常工作方面取得了一定的成功,但我正在努力让
numericRangeInput()
函数与动态生成的 UI 一起使用,就像 textInput()
可以 就像本例中那样,其中 isolate()
函数用于在更新 UI 时保持输入中的相同值。
这种方法在理论上是可行的,但只有当范围的两个值都被填充时。除此之外,它会抛出最小值和最大值的错误,因为它们在初始化中是
NA
,而numericRangeInput()
无法处理。解决方法是在将服务器代码发送到 UI 输出之前指定范围的值,但这只是重新引入了在列表中添加或删除项目时重置用户值的问题。
到目前为止,这是最小的“工作”示例:
library(shiny)
library(shinyWidgets)
library(tidyverse)
ui <- fluidPage(
actionButton("add",'+'),
actionButton("sub",'-'),
uiOutput("range"),
textOutput("numbs")
)
server <- function(input, output, session) {
num_col <- reactiveVal(2)
col_numbs <- reactive(paste("#",seq_len(num_col())))
observeEvent(input$add,{
num_col(num_col()+1)
})
observeEvent(input$sub,{
if(num_col()>1){
num_col(num_col()-1)
}
})
output$range <- renderUI({
map(col_numbs(), ~
numericRangeInput(.x, NULL,
value = isolate(input[[.x]]),
separator = "-",
min = 0,
step = 1)
)
})
output$numbs <- renderText({
map_chr(col_numbs(), ~ paste(input[[.x]],collapse = "-"))
})
}
shinyApp(ui,server)
请注意,对于生成的每个
numericRangeInput()
实例以及每个后续生成,只要至少有一个值未定义,它就会在控制台中产生以下错误:
Warning in min(value) : no non-missing arguments to min; returning Inf
Warning in max(value) : no non-missing arguments to max; returning -Inf
将行
value = isolate(input[[.x]]),
更改为 value = c(0,0)
可以修复此错误,但代价是无法保存输入值。
一如既往,我感谢您提供的任何帮助。
使用
dplyr::coalesce
函数可以实现一个非常简单的解决方案:
numericRangeInput(.x, NULL,
value = isolate(coalesce(input[[.x]], c(-Inf, Inf))),
separator = "-",
min = 0,
step = 1)
它返回每个位置的第一个非缺失值。即使输入的一侧/两侧都是空的,这也有效。