我是Shiny的新手,但已经发现它对于快速GUI开发最有趣。
我试图得到以下内容:我基本上有两个textInputs。当第一个更改时,我希望第二个更新一些新值(不使用任何actionButton),反之亦然。但我得到了无限循环。
更新意味着添加一个的简单示例是:
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)
})
})
library(shiny)
shinyUI(basicPage(
textInput("field1", "Field 1", ""),
textInput("field2", "Field 2", "")
))
我试图在对isolate()的调用中封装'input $ field1'和'input $ field2',但这并没有解决问题。
有什么建议吗? 非常感谢,
Yvonnick
答案 0 :(得分:2)
万一有人遇到类似的问题,我终于找到了以下解决方案,使用布尔反应值作为激活/阻止文本输入更新的标志。
library(shiny)
shinyUI(basicPage(
textInput("value1", "Value 1", ""),
textOutput("value1TRUE"),
textInput("value2", "Value 2", ""),
textOutput("value2TRUE")
))
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