首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ShinyApp -反应性不孕

ShinyApp -反应性不孕
EN

Stack Overflow用户
提问于 2022-03-04 10:10:31
回答 1查看 27关注 0票数 0

我有两个输入变量,其中一个会导致另一个变量的变化。此外,如果输入的值是外部限制,它应该默认为min (如果下面)或最大值(如果以上)值。只要使用上下箭头,一切都能正常工作。当我在Input1中输入值1时,它就疯狂了。如果我要删除Input2,甚至在我输入任何东西之前.

我知道它一定与反应值有关,但不能修复它.任何建议都将不胜感激!

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2022-03-04 14:48:31

你在进入种族条件的边缘

输入1更改输入2更改输入1更改输入2.

所以最重要的是你应该重新考虑你的设计。您可以使用debounce / throttle来避免某些竞争考虑,方法是告诉闪亮不要太快触发,而且由于更新是双向的,您可能会实现您想要的结果,但是我会真正考虑您的设计b/c --这些循环依赖关系几乎不是一个好主意。

尽管如此,这里有一个性能更好的解决方案(N.B.我删除了第二个输入元素的动态呈现,因为它与手头的问题无关)。这是不完美的,你最终会在赛车状态下结束,但是你可以通过玩脱扣器来软化这种情况。

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71349782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档