我想让用户界面从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。显然这不是我想要的。有谁知道这里出了什么问题?我猜我错过了什么。
非常感谢提前!
答案 0 :(得分:3)
使用actionButton("counter")
而不是submitButton,并在input$counter
中检查dynamicUi
是偶数还是奇数。
你的代码不起作用的原因是因为像dynamicUi
这样的反应式表达式只在他们读取的反应值(或其他反应性表达式或其他反应性事物,如invalidateLater
)导致反应性时执行被触发。在这种情况下,dynamicUI
不会读取任何被动值,因此它不会执行多次。但是,如果您使用actionButton("counter")
并阅读input$counter
,那么只要input$counter
更改,反应式表达式就会重新执行。