Я хочу обновить значение на основе textInput()
внутри modalDialog()
. Я нашел ответ это, который работает, но он использует reactiveValues()
, что создает проблемы в моем случае ниже в моем коде.
Есть ли способ обновить мое значение text
через textInput()
и modalDialog()
без использования reactiveValues()
?
Это работает
library(shiny)
library(shinyWidgets)
if (interactive()) {
shinyApp(
ui <- fluidPage(
actionBttn("reset", "RESET", style = "simple", size = "sm", color = "warning"),
verbatimTextOutput(outputId = "text")
),
server = function(input, output, session) {
l <- reactiveValues()
observeEvent(input$reset, {
# display a modal dialog with a header, textinput and action buttons
showModal(modalDialog(
tags$h2('Please enter your personal information'),
textInput('name', 'Name'),
textInput('state', 'State'),
footer=tagList(
actionButton('submit', 'Submit'),
modalButton('cancel')
)
))
})
# only store the information if the user clicks submit
observeEvent(input$submit, {
removeModal()
l$name <- input$name
l$state <- input$state
})
# display whatever is listed in l
output$text <- renderPrint({
if (is.null(l$name)) return(NULL)
paste('Name:', l$name, 'and state:', l$state)
})
}
)
}
Это не работает
Не удается обновить значение l
, когда я не использую l <- reactiveValues()
.
library(shiny)
library(shinyWidgets)
if (interactive()) {
shinyApp(
ui <- fluidPage(
actionBttn("reset", "RESET", style = "simple", size = "sm", color = "warning"),
verbatimTextOutput(outputId = "text")
),
server = function(input, output, session) {
l <- NULL
observeEvent(input$reset, {
# display a modal dialog with a header, textinput and action buttons
showModal(modalDialog(
tags$h2('Please enter your personal information'),
textInput('name', 'Name'),
footer=tagList(
actionButton('submit', 'Submit'),
modalButton('cancel')
)
))
})
# only store the information if the user clicks submit
observeEvent(input$submit, {
removeModal()
l <- input$name
})
# display whatever is listed in l
output$text <- renderPrint({
if (is.null(l)) return(NULL)
paste('Name:', l)
})
}
)
}
renderPrint
нуждается в reactive
зависимости, чтобы сделать ее недействительной и повторно отобразить. Соответственно, использование нереактивной переменной в этом сценарии не имеет никакого смысла.
Вы должны скорее работать над нисходящими проблемами.
Вот еще один подход с использованием eventReactive
:
library(shiny)
library(shinyWidgets)
ui <- fluidPage(
br(),
actionBttn("reset", "RESET", style = "simple", size = "sm", color = "warning"),
verbatimTextOutput(outputId = "text")
)
server <- function(input, output, session) {
observeEvent(input$reset, {
# display a modal dialog with a header, textinput and action buttons
showModal(modalDialog(
tags$h2('Please enter your personal information'),
textInput('name', 'Name'),
footer=tagList(
actionButton('submit', 'Submit'),
modalButton('cancel')
)
))
})
# only store the information if the user clicks submit
submittedName <- eventReactive(input$submit, {
removeModal()
input$name
})
output$text <- renderPrint({
req(submittedName())
paste('Name:', submittedName())
})
}
shinyApp(ui, server)
Редактировать:, используя reactiveVal
вместо заполнителя:
library(shiny)
library(shinyWidgets)
ui <- fluidPage(
br(),
actionBttn("reset", "RESET", style = "simple", size = "sm", color = "warning"),
verbatimTextOutput(outputId = "text")
)
server <- function(input, output, session) {
observeEvent(input$reset, {
# display a modal dialog with a header, textinput and action buttons
showModal(modalDialog(
tags$h2('Please enter your personal information'),
textInput('name', 'Name'),
footer=tagList(
actionButton('submit', 'Submit'),
modalButton('cancel')
)
))
})
submittedName <- reactiveVal("placeholder")
# only store the information if the user clicks submit
observeEvent(input$submit, {
removeModal()
submittedName(input$name)
})
output$text <- renderPrint({
paste('Name:', submittedName())
})
}
shinyApp(ui, server)
Реактивные значения?
@fschier, если вам нужно инициализировать значение, просто используйте reactiveValues
(или reactiveVal
), как вы делали в своем первом примере и как упоминалось @gaut. Пожалуйста, смотрите мое редактирование.
Спасибо за вклад, похоже, мне придется поработать над устранением проблем с нисходящим потоком с помощью reactiveVal
, если я хочу реализовать этот подход.
@fschier да, кажется, это необходимо - просто задайте дополнительный вопрос, если это необходимо. Ваше здоровье
Большое спасибо! Это решает проблему обновления для меня. Однако теперь мне не хватает «заполнителя» или значения по умолчанию, которое будет сохранено, если пользователь еще не отправил значение. Объявление
submittedName <- "Placeholder"
илиsubmittedName <- reactive("Placeholder")
на сервере не сработало, у вас есть предложения в этом случае?