使用textInput作为闪亮的输入和输出字段

时间:2014-12-22 17:49:18

标签: r shiny

我是Shiny的新手,但已经发现它对于快速GUI开发最有趣。

我试图得到以下内容:我基本上有两个textInputs。当第一个更改时,我希望第二个更新一些新值(不使用任何actionButton),反之亦然。但我得到了无限循环。

更新意味着添加一个的简单示例是:

server.r

library(shiny)

shinyServer(function(input, output,session) {

  observe({
    newval = as.numeric(input$field1)+1
    updateTextInput(session,"field2",value=newval)
  })

  observe({
    newval = as.numeric(input$field2)+1
    updateTextInput(session,"field1",value=newval)
  })
})

ui.R

library(shiny)   

shinyUI(basicPage(

    textInput("field1", "Field 1", ""),
    textInput("field2", "Field 2", "")

))

我试图在对isolate()的调用中封装'input $ field1'和'input $ field2',但这并没有解决问题。

有什么建议吗? 非常感谢,

Yvonnick

1 个答案:

答案 0 :(得分:2)

万一有人遇到类似的问题,我终于找到了以下解决方案,使用布尔反应值作为激活/阻止文本输入更新的标志。

ui.R

library(shiny)   

shinyUI(basicPage(

  textInput("value1", "Value 1", ""),
  textOutput("value1TRUE"),
  textInput("value2", "Value 2", ""),
  textOutput("value2TRUE")
))

server.R

library(shiny)

shinyServer(function(input, output,session) {

  myVals = reactiveValues(changeValue1=TRUE,changeValue2=TRUE)

  observe({
    if( (input$value1=="") || is.na(input$value1) ) return(NULL)
    isolate({
      if(!myVals$changeValue2) {
        myVals$changeValue2 = TRUE
        return(NULL)
      }
      myVals$changeValue1 = FALSE
      updateTextInput(session,"value2",value=as.numeric(input$value1)+1)
    })
  })

  observe({
    if( (input$value2=="") || is.na(input$value2) ) return(NULL)
    isolate({
      if(!myVals$changeValue1) {
        myVals$changeValue1 = TRUE
        return(NULL)
      }
      myVals$changeValue2 = FALSE
      updateTextInput(session,"value1",value=as.numeric(input$value2)+1)
    })
  })

  output$value1TRUE = renderText(as.character(myVals$changeValue1))
  output$value2TRUE = renderText(as.character(myVals$changeValue2))
})

如果有些闪亮的大师找到了更轻松的解决方案,我有兴趣了解它: - )

最佳, Yvonnick