#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?