如何为selectinput中的不同选项创建两个observeEvent函数

时间:2018-05-16 13:23:37

标签: r shiny

我程序中的结果页面旨在以不同方式响应用户输入的不同选项。我觉得observeEvent似乎很相关但是当我这样写的时候它只显示最新的observeEvent(这是女性)。

以下是我的代码的简化版本:

library(shiny)

ui <- fluidPage(

mainPanel(tabsetPanel(type = "tabs",
                    tabPanel("Personal Information", 
                             selectInput("gender","What is your biological gender?:",c("--" = "null","male" = "gender1","female" = "gender2"))
                    ),
                    tabPanel("Result", verbatimTextOutput("result"))
  )))

server <- function(input, output) { 


observeEvent({input$gender == "gender1"},output$result <- renderPrint ("You are a male."))
observeEvent({input$gender == "gender2"},output$result <- renderPrint ("You are a female."))

}

shinyApp(ui, server)

2 个答案:

答案 0 :(得分:0)

每当observeEvent更改时,您应该使用一个input$gender触发器。然后有一个条件内部,确定返回什么值。实际上你根本不需要observeEvent,因为任何被动表达式(包括renderPrint)都会在其中的任何被动值无效时更新。因此,执行所需操作的最佳方法是使用以下内容替换回合observeEvent函数:

output$result <- renderPrint({
    if (input$gender == 'gender1') {
        return("You are a male.")
    } else if (input$gender == 'gender2') {
        return("You are a female.")
    }
})

使用event函数与render*的区别在于代码块被视为位于isolate块中,只有eventExpr的更改才会触发代码运行。如果您只想在按下更新按钮时运行代码,那将是很好的,但如果您希望它对更改的值有所反应(如您的示例中所示),则不应该&#39 ; t使用event函数。

此外,强烈建议您如上所述嵌套反应式表达式。如果您必须使用event函数驱动renderPrint函数(如您的示例所示),那么推荐的方法是使用eventReactive

gender_input <- eventReactive(input$update, {
    if (input$gender == 'gender1') {
        return("You are a male.")
    } else if (input$gender == 'gender2') {
        return("You are a female.")
    }
})

output$result <- renderPrint({gender_input()})

答案 1 :(得分:0)

或者您可以将所有内容放在1个observeEvent中,根据条件,更改所需的文本然后在renderPrint函数中使用它,如下所示:

server <- function(input, output) { 
  observeEvent(input$gender, {
    if (input$gender == "gender1") {
      txt <- "You are a male."
    } else if (input$gender == "gender2") {
      txt <- "You are a female."
    } else {
      txt <- NULL
    }
    output$result <- renderPrint(txt)
  })
}

尽管我也赞成@divibisan的解决方案。

您可以使用存储文本的reactiveValue。通过这种方式,您可以访问服务器函数中的任何位置的文本,而不必将rnderPrint函数嵌套在observeEvent中。这是您对服务器功能的处理方式:

server <- function(input, output) { 

  reactTXT <- reactiveValues(txt=NULL)

  observeEvent(input$gender, {
    if (input$gender == "gender1") {
      txt <- "You are a male."
    } else if (input$gender == "gender2") {
      txt <- "You are a female."
    } else {
      txt <- NULL
    }
    reactTXT$txt <- txt
  })

  output$result <- renderPrint({
    reactTXT$txt
    })
}

首先创建reactiveValue reactTXT。在observeEvent中,您使用reactTXT$txt <- txt将文本分配给reactiveValue。在renderPrint函数中,您只需传递reactiveValue reactTXT$txt即可打印它。