[英]selectInput update inside renderUI function in shiny app
我已将闪亮的应用程序简化如下:
library(shiny)
library(shinythemes)
library(shinyBS)
ui <- fluidPage(
theme = shinytheme("flatly"),
navbarPage("Demo",
tabPanel("Home",
column(2,
selectInput(inputId = "s1",label = "select project",choices = c("1", "2", "3")),
uiOutput("sensor")
))))
server <- function(input, output,session){
output$sensor <- renderUI({
s = c(as.numeric((input$s1))^2,as.numeric((input$s1))^3)
selectInput("t1",label ="Select",choices = ifelse(input$s1 == "1",c("x1","x2"),s ),multiple = FALSE)
})
}
如果我的第一个选择是 1,我希望在第二个下拉列表中获得x1
和x2
,否则4
和8
或9
和27
应该是第二个下拉列表中的预期值。
但令人惊讶的是,我得到的只是在第二个下拉列表中选择的一个值:如果1
我得到x1
,如果2
我只有4
,如果3
我只有9
!
为什么selectInput
没有正确更新?
从ifelse
的在线帮助:
ifelse 返回一个与 test 具有相同形状的值,该值填充有从 yes 或 no 中选择的元素,具体取决于 test 的元素是 TRUE 还是 FALSE。
和
ifelse(测试,是,否)
在您的情况下, test
是input$s1 == "1"
。 换句话说,一个长度为 1 的(字符)向量。这就是为什么您在input$t1
的选择中只能得到一个值。
要得到你想要的,试试这样的(未经测试的代码):
if (input$s1 == "1") {
choiceList <- c("x1","x2")
} else {
choiceList <- c(as.numeric((input$s1))^2,as.numeric((input$s1))^3)
}
selectInput("t1",label ="Select",choices = choiceList, multiple = FALSE)
顺便说一句,您可以使用updateSelectInput
获得相同的效果,而无需renderUI
和uiOutput
。
编辑
这是uiOutput
版本的完整代码
library(shiny)
ui <- fluidPage(
navbarPage("Demo",
tabPanel("Home",
column(2,
selectInput(inputId = "s1",label = "select project",choices = c("1", "2", "3")),
uiOutput("sensor")
))))
server <- function(input, output,session){
output$sensor <- renderUI({
if (input$s1 == "1") {
choiceList <- c("x1","x2")
} else {
choiceList <- c(as.numeric((input$s1))^2,as.numeric((input$s1))^3)
}
selectInput("t1",label ="Select",choices = choiceList, multiple = FALSE)
})
}
shinyApp(ui = ui , server = server)
对于updateSelectinput
版本
library(shiny)
ui <- fluidPage(
navbarPage("Demo",
tabPanel("Home",
column(2,
selectInput(inputId = "s1",label = "select project",choices = c("1", "2", "3")),
selectInput("t1", label="Select", choices=c(), multiple = FALSE)
))))
server <- function(input, output, session){
observeEvent(input$s1, {
if (input$s1 == "1") {
choiceList <- c("x1","x2")
} else {
choiceList <- c(as.numeric((input$s1))^2,as.numeric((input$s1))^3)
}
updateSelectInput(session, "t1",choices = choiceList)
})
}
shinyApp(ui = ui , server = server)
就个人而言,我更喜欢后者,因为它看起来更干净。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.