我程序中的结果页面旨在以不同方式响应用户输入的不同选项。我觉得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)
答案 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
即可打印它。