在R Shiny中从renderUI访问输入的问题

时间:2017-07-11 17:00:22

标签: r user-interface ggplot2 shiny

我是Shiny的新手,但我正在开发一个需要在UI和shinyServer之间来回的应用程序。为此,我熟悉了动态renderUI功能。但是,我有一些问题正确处理通过renderUI函数发送到UI的输入。

我编写了一个关于我的问题的快速玩具示例。

library(shiny)

ui <- fluidPage(
numericInput("cat.count", "How many cats do you have?", min = 0, value = 0),
checkboxInput('pet.check',"Do you other pets?", value = FALSE),
uiOutput("dog.input"),
uiOutput("dog.num")
)

server <- shinyServer(function(input,output){

output$dog.input <- renderUI({
if(input$pet.check){
    return(checkboxInput("dog.check", "Do you have dogs?", value = FALSE))
}
})
output$dog.num <- renderUI({
if (exists("input$dog.check") & input&dog.check){
    return(numericInput("dog.count", "How many dogs do you have?", min = 1, 
value = 0))
}

})

})

shinyApp(ui = ui,server = server)

一旦这个玩具应用程序运行没有错误,“最终产品”将是一个简单的条形图,通过geom_bar与ggplot2图形显示用户拥有的宠物总数。

除了req()和exists()函数之外,我还研究了reactive()函数,但到目前为止,我已经在圈内运行了。

提前致谢!

2 个答案:

答案 0 :(得分:3)

像这样的工作吗?

rm(list = ls())
library(shiny)

ui <- fluidPage(
  numericInput("cat.count", "How many cats do you have?", min = 0, value = 0),
  checkboxInput('pet.check',"Do you other pets?", value = FALSE),
  uiOutput("dog.input"),
  uiOutput("dog.num")
)

server <- shinyServer(function(input,output){

  output$dog.input <- renderUI({
    if(is.null(input$pet.check)){return()}
    if(input$pet.check){
      return(checkboxInput("dog.check", "Do you have dogs?", value = FALSE))
    }
  })
  output$dog.num <- renderUI({
    if(is.null(input$dog.check)){return()}
    numericInput("dog.count", "How many dogs do you have?", min = 1, value = 0)

  })

})
runApp(list(ui = ui, server = server))

enter image description here

答案 1 :(得分:0)

如果您输入类似

的语句
A(x) & B(x)

进入R,即使A错误,BA(x)也会得到评估。这是您的错误来自的地方。因此,最好使用嵌套的if语句,如Pork Chop的答案