r语言 - 闪亮的数字输入总和未按预期更新



我想用命名列表中的初始值填充闪亮的numericInput框。(值和名称已导入,但此处只是编码。初始值相加并显示在数字输入的右侧。

如果我更改任一numericInput中的值,我希望总和更新。(我可能也不需要更新。我可以填充值并获得初始总和。但是,如果我更改一个值,总和不会更新。

如果我更改numericInput,我尝试了一种observeEvent来更新总和。我在下面的 MWE 中假设的反应式"逻辑"是:

  1. 初始值是反应性的,因此可以更新它们。
  2. total是两个无功值之和的无功值。
  3. 观察者事件监视numericInput的变化(这里只是第一个(并更新关联的反应值(amounts$amt1(。
  4. 因为反应值是更新的,所以我认为反应total也会更新,从而更新output$total1

如果我不使用 amt1 的observeEvent,则数字输入将正确初始化和求和,但对输入的后续更改不会更改总和(总计 = 21(。这是有道理的,因为我没有observeEvent关注变化。

如果我包含一个observeEvent,则观察到的numericInput将重置为 UI 中编码的默认值 (1(,而不是使用初始值。然后将这些值相加。对输入的后续更改不会更改总和(总计 = 12(。

问题

如果我从界面更改初始值,如何使用初始值填充数字输入,然后更新总和?我确定我没有正确使用反应器,但我无法找出正确的方法。

兆威

library(shiny)
vals <- as.list(c(10, 11))
names(vals) <- c("val1", "val2")
ui <- fluidPage(
fluidRow(
column(3, 
numericInput(
inputId = "amt1", 
label = "Amount 1",
value = 1)
),
column(3,
numericInput(
inputId = "amt2",
label = "Amount 2",
value = 2)
),
column(3,
textOutput("total1")
)
),
)
server <- function(input, output, session) {
amounts <- reactiveValues(
amt1 = vals$val1,
amt2 = vals[["val2"]]
)
observe({
updateNumericInput(
session,
inputId = "amt1",
value = amounts$amt1
)
updateNumericInput(
session,
inputId = "amt2",
value = amounts$amt2
)
})
total <- reactive({
sum(amounts$amt1, amounts$amt2)
})
# If this runs, it resets input$amt1 to default value.
observeEvent("input$amt1", {
amounts$amt1 <- input$amt1
})
output$total1 <- renderText(total())
# Tried this too, but it didn't change anything.
#output$ui <- renderUI({
#  tagList(
#    numericInput("amt1", value = amounts$amt1),
#    numericInput("amt2", value = amounts$amt2),
#    output$total1 <- renderText(total())
#  )
#})
}
shinyApp(ui, server)

你正在使它变得复杂。这是一个工作示例:

library(shiny)
vals <- as.list(c(10, 11))
names(vals) <- c("val1", "val2")
ui <- fluidPage(
fluidRow(
column(3, 
numericInput(
inputId = "amt1", 
label = "Amount 1",
value = vals[['val1']])
),
column(3,
numericInput(
inputId = "amt2",
label = "Amount 2",
value = vals[['val2']])
),
column(3,
textOutput("total1")
)
),
)
server <- function(input, output, session) {
amounts = reactiveValues(
amt1 = vals[['val1']],
amt2 = vals[['val2']]
)
observe({
amounts$amt1 = input$amt1
amounts$amt2 = input$amt2
})
output$total1 = renderText({input$amt1 + input$amt2})
}
shinyApp(ui, server)

最新更新