生成动态 UI 元素时如何将 numericRangeInput() 与isolate() 结合使用

问题描述 投票:0回答:1

我已经使用闪亮有一段时间了,我正在尝试生成动态 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)
可以修复此错误,但代价是无法保存输入值。

一如既往,我感谢您提供的任何帮助。

r user-interface shiny tidyverse shinywidgets
1个回答
0
投票

使用

dplyr::coalesce
函数可以实现一个非常简单的解决方案:

  numericRangeInput(.x, NULL,     
                    value = isolate(coalesce(input[[.x]], c(-Inf, Inf))), 
                    separator = "-", 
                    min = 0, 
                    step = 1)

它返回每个位置的第一个非缺失值。即使输入的一侧/两侧都是空的,这也有效。

© www.soinside.com 2019 - 2024. All rights reserved.