У меня есть блестящее приложение, которое динамически удаляет и вставляет пользовательский интерфейс ввода в зависимости от выбора пользователя. Пользовательский интерфейс, созданный путем выбора choice1 и choice2, совместно использует часть своих полей ввода. Я хотел использовать пакет shinyvalidate, чтобы добавить некоторые правила проверки, которые могут применяться к общим входам. В следующем примере пользователь может сделать выбор на боковой панели. Как только выбор будет сделан, div с идентификатором «content» на главной панели будет удален, и будет вставлен новый div. Кажется, что правила работают, но если я сначала не наберу что-то в поле ввода, красное предупреждающее сообщение не появится при переключении вариантов.
library(shiny)
library(glue)
library(shinyvalidate)
ui <- fluidPage(
sidebarPanel(
selectInput("select", label = "select", choices = c("", "choice1", "choice2"))
),
mainPanel(id = "main",
tags$div(id = "content"))
)
server <- function(input, output) {
# validate input
iv <- InputValidator$new()
iv$add_rule("input", sv_required())
iv$enable()
observeEvent(input$select, {
if (input$select == "choice1"){
removeUI("#content")
insertUI("#main", ui = tags$div(
id = "content",
textInput("input", "input")))
}
if (input$select == "choice2"){
removeUI("#content")
insertUI("#main", ui = tags$div(
id = "content",
textInput("input", "input")))
}
})
}
# Run the application
shinyApp(ui = ui, server = server)





Это работает, запуская iv$enable после того, как observeEvent завершит свою работу (я думаю, что «недействительным» является правильная формулировка).
server <- function(input, output) {
# validate input
iv <- InputValidator$new()
iv$add_rule("input", sv_required())
Validate <- reactiveVal(NULL)
observeEvent(input$select, {
iv$disable()
if (input$select == "choice1"){
removeUI("#content")
insertUI("#main", ui = tags$div(
id = "content",
textInput("input", "input")))
}
if (input$select == "choice2"){
removeUI("#content")
insertUI("#main", ui = tags$div(
id = "content",
textInput("input", "input")))
}
Validate(TRUE)
})
observeEvent(Validate(), {
iv$enable()
Validate(NULL)
})
}
Я не знаю почему, но вы должны установить immediate = TRUE как в removeUI, так и в insertUI:
if (input$select == "choice1"){
removeUI("#content", immediate = TRUE)
insertUI("#main", ui = tags$div(
id = "content",
textInput("input", "input")), immediate = TRUE)
}
if (input$select == "choice2"){
removeUI("#content", immediate = TRUE)
insertUI("#main", ui = tags$div(
id = "content",
textInput("input", "input")), immediate = TRUE)
}
@Bei Действительно. Смотрите мою правку.
Спасибо. Я обнаружил, что проблема на самом деле в том, что красное предупреждающее сообщение не появляется, когда я переключаю варианты (без предварительного ввода чего-либо). Правила, кажется, все еще работают. Я отредактировал вопрос.