Генерация реактивных предупреждений обратной связи для динамически генерируемых входных данных с блестящими

#r #validation #shiny #reactive #renderui

Вопрос:

Блестящий новичок здесь! Я пытаюсь создать приложение, в котором пользователь может вводить динамическое количество 8-значных кодов. Сначала они вводят количество кодов, которые им нравятся, и, используя renderUI, генерируют столько слотов.

Я хотел бы использовать ShinyFeedback для проверки nchar для каждого вставленного кода и показывать предупреждение, если оно не состоит из 8 цифр. Это то, что у меня есть до сих пор для:

   code_check <- reactive({

    lapply(1:input$numInputs, function(i) {

      shinyFeedback::feedbackWarning(input$inputName,
                                     nchar(input$inputName) != 8,
                                     "Your code needs to be 8 digits!")
    }

    )
  })
 

У меня возникли проблемы с доступом к отдельным входным данным по их идентификатору. Имя ввода$INPUT создается в разделе renderUI:

   observeEvent(input$numInputs, {
    
    output$inputGroup = renderUI({
      
      input_list <- lapply(1:input$numInputs, function(i) {
        
        # for each dynamically generated input, give a different name
        inputName <- paste("Code ", i, sep = " ")
        
        # generate the input field, the inputID = label, initial value is 12345678
        textInput(inputName, inputName, "12345678")
        
      })
      
      })
    
    })
 

При запуске этого кода возникает следующая ошибка: Warning: Error in feedback: is.character(inputId) is not TRUE

Заполните текущий код ниже:

 library(shiny)

ui <- shinyUI(fluidPage(
  
  shinyFeedback::useShinyFeedback(),
  
  titlePanel("As many 8 digit codes as you like"),
  
  sidebarLayout(
    sidebarPanel(
      numericInput("numInputs", "How many codes would you like to insert?", 4),
      # place to hold dynamic inputs
      uiOutput("inputGroup")
    ),

    mainPanel(textOutput("inputValues"),
              textOutput("final"),
              textOutput("code_check")
              
    )
    
  )
))

server <- shinyServer(function(input, output) {
  
  # observe changes in "numInputs", and create corresponding number of inputs

  observeEvent(input$numInputs, {
    
    output$inputGroup = renderUI({
      
      input_list <- lapply(1:input$numInputs, function(i) {
        
        # for each dynamically generated input, give a different name
        inputName <- paste("Code ", i, sep = " ")
        
        # generate the input field, the inputID = label, initial value is 12345678
        textInput(inputName, inputName, "12345678")
        
      })
      
      })
    
    })

  code_check <- reactive({

    lapply(1:input$numInputs, function(i) {

      shinyFeedback::feedbackWarning(input$inputName,
                                     nchar(input$inputName) != 8,
                                     "Your code needs to be 8 digits!")
    }

    )
  })
  
  output$code_check <- renderPrint({code_check()})
  
  test <- reactive({
    paste(lapply(1:input$numInputs, function(i) {
      
      inputName <- paste("Code ", i, sep = " ")
      input[[inputName]]
    }))
  })

output$final <- renderPrint({test()})
  
  observe({
    assign(
      x = "inserted_codes",
      value =  test(),
      envir = .GlobalEnv
    )
  })
  
})

shinyApp(ui, server)
 

Буду признателен за любые идеи 🙂

Комментарии:

1. Есть несколько проблем. Вы определяете inputName в renderUI , и это не выходит за рамки этой области. Вне этого renderUI inputName ничего не существует. Затем вы вставляете пробел во входной идентификатор, что недопустимо. И в вашем lapply у вас есть функция i , но i она не отображается в теле функции. И input$inputName есть NULL , вот почему вы получаете эту ошибку от shinyFeedback .

2. Но есть ли какой-либо способ получить имя ввода, сгенерированное в renderUI?