我想用命名列表中的初始值填充闪亮的numericInput
框。(值和名称已导入,但此处只是编码。初始值相加并显示在数字输入的右侧。
如果我更改任一numericInput
中的值,我希望总和更新。(我可能也不需要更新。我可以填充值并获得初始总和。但是,如果我更改一个值,总和不会更新。
如果我更改numericInput
,我尝试了一种observeEvent
来更新总和。我在下面的 MWE 中假设的反应式"逻辑"是:
- 初始值是反应性的,因此可以更新它们。
total
是两个无功值之和的无功值。- 观察者事件监视
numericInput
的变化(这里只是第一个(并更新关联的反应值(amounts$amt1
(。 - 因为反应值是更新的,所以我认为反应
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)