如何在shinyapp中以交互方式更改UI

时间:2013-12-08 11:34:30

标签: r shiny

我想让用户界面从textarea以交互方式更改为selectInput,然后再返回。

这是我放在server.r中的内容。我使用counter1和counter2让shinyapp知道选择哪个动态ui。点击提交按钮时,会向counter1或counter2添加1。这样,counter1和counter2将交替相同或不相同。

 library(shiny)
counter1 <- 1
counter2 <- 0
shinyServer(function(input, output) {

output$MainAction <- renderUI( {
    dynamicUi()
  })

dynamicUi <- reactive({
if (counter11 == counter2){
counter1 <- counter1 + 1
return(
selectInput("choose","Choose yes or no", choices = c("yes"="yes","no"="no"))
)
}
else {
counter2 <- counter2 + 1
return(  
tags$textarea(id="textfield", rows=8, cols=90, "put your text here")
)
}
})
})

这就是我在ui.r中的内容。

library(shiny)

shinyUI(pageWithSidebar(


headerPanel("My shiny app"),

sidebarPanel(

uiOutput("MainAction"), 
submitButton("action")    

  ),


  mainPanel(
    tabsetPanel(
      tabPanel("Output", uiOutput("outputaction"))

    )
  )
))

结果是shinyapp坚持使用textarea。显然这不是我想要的。有谁知道这里出了什么问题?我猜我错过了什么。

非常感谢提前!

1 个答案:

答案 0 :(得分:3)

使用actionButton("counter")而不是submitButton,并在input$counter中检查dynamicUi是偶数还是奇数。

你的代码不起作用的原因是因为像dynamicUi这样的反应式表达式只在他们读取的反应值(或其他反应性表达式或其他反应性事物,如invalidateLater)导致反应性时执行被触发。在这种情况下,dynamicUI不会读取任何被动值,因此它不会执行多次。但是,如果您使用actionButton("counter")并阅读input$counter,那么只要input$counter更改,反应式表达式就会重新执行。