我有两个输入变量,其中一个会导致另一个变量的变化。此外,如果输入的值是外部限制,它应该默认为min (如果下面)或最大值(如果以上)值。只要使用上下箭头,一切都能正常工作。当我在Input1中输入值1时,它就疯狂了。如果我要删除Input2,甚至在我输入任何东西之前.
我知道它一定与反应值有关,但不能修复它.任何建议都将不胜感激!
library(shiny)
ui <- fluidPage(
fluidRow(
uiOutput("Input1"),
numericInput("Input2", "Input 2",
min = 50, max = 150,
value = 100, step = 1)),
tableOutput("result")
)
#########################################################
server <- function(input, output, session) {
global <- reactiveValues(numVal = 10, numMin = 5, numMax = 15)
numVal <- reactive({
if(!is.null(input$Input1)){
if(input$Input1 < global$numMin) return(global$numMin)
if(input$Input1 > global$numMax) return(global$numMax)
return(input$Input1)
}else{
return(global$numVal)
}
})
output$Input1 <- renderUI(numericInput("Input1", "Input 1",
min = global$numMin, max = global$numMax,
value = numVal(), step = 0.1))
# when Input1 change, update Input2
observeEvent(input$Input1, {
updateNumericInput(session = session,
"Input2",
value = format(round(input$Input1*10, 0), nsmall = 0))
})
# when Input2 change, update Input1
observeEvent(input$Input2, {
updateNumericInput(session = session,
"Input1",
value = format(round(input$Input2*0.1, 1), nsmall = 1))
})
inputdata <- reactive({
data <- data.frame(Coef = as.numeric(input$Input1))
data
})
output$result <- renderTable({
data = inputdata()
resultTable = as.character(round((data$Coef + 10)*100, digits=2))
resultTable
})
}
#########################################################
shinyApp(ui, server)发布于 2022-03-04 14:48:31
你在进入种族条件的边缘
输入1更改输入2更改输入1更改输入2.
所以最重要的是你应该重新考虑你的设计。您可以使用debounce / throttle来避免某些竞争考虑,方法是告诉闪亮不要太快触发,而且由于更新是双向的,您可能会实现您想要的结果,但是我会真正考虑您的设计b/c --这些循环依赖关系几乎不是一个好主意。
尽管如此,这里有一个性能更好的解决方案(N.B.我删除了第二个输入元素的动态呈现,因为它与手头的问题无关)。这是不完美的,你最终会在赛车状态下结束,但是你可以通过玩脱扣器来软化这种情况。
library(shiny)
ui <- fluidPage(
fluidRow(
numericInput("Input1", "Input 1",
min = 5, max = 15, value = 10, step = .1),
numericInput("Input2", "Input 2",
min = 50, max = 150,
value = 100, step = 1)),
tableOutput("result")
)
server <- function(input, output, session) {
## debounce both input, i.e. they are firing onyl if no change within 1sec happens
## c.f. ?debounce
getI1 <- reactive(input$Input1) %>%
debounce(1000)
getI2 <- reactive(input$Input2) %>%
debounce(1000)
observeEvent(input$Input1, {
updateNumericInput(session = session,
"Input2",
value = format(round(getI1() * 10, 0), nsmall = 0))
})
observeEvent(input$Input2, {
updateNumericInput(session = session,
"Input1",
value = format(round(getI2() * 0.1, 1), nsmall = 1))
})
inputdata <- reactive({
data <- data.frame(Coef = as.numeric(input$Input1))
data
})
output$result <- renderTable({
data = inputdata()
resultTable = as.character(round((data$Coef + 10)*100, digits=2))
resultTable
})
}
shinyApp(ui, server)https://stackoverflow.com/questions/71349782
复制相似问题