我有2个列表,每个列表包含以另一个变量p_id为条件的IDs d

d1 <- as.list(unique(df$p_id[df$d==1]))
d2 <- as.list(unique(df$p_id[df$d==2]))

我想在我 Shiny 的应用程序中添加一个conditionalPanel以相应地显示/隐藏selectInput小部件。

在我的用户界面dashboardPagedashboardBody中,我具有以下内容:
box(
                  conditionalPanel(
                    condition = "input.p_id.indexOf('d1')!=-1"
                    , selectInput(
                      inputId = "d_number"
                      ,label = "Select Day:"
                      ,choices = list("Day 1" = "1")
                      ,selected = "1"
                    )
                  ),

                  conditionalPanel(
                    condition = "input.p_id.indexOf('d2')!=-1"
                    , selectInput(
                      inputId = "d_number"
                      ,label = "Select Day:"
                      ,choices = list("Day 1" = "1", "Day 2" = "2")
                      ,selected = "1"
                      )
                  )
                ),

我的理解是condition必须在js中,而不是r中。例如,我正在尝试为第一个条件复制p_id %in% d1。但是,这不起作用。

我尝试了condition = "input.p_id.indexOf(d1)!=-1",但它也不起作用。

任何人都可以为我想要实现的建议正确的js语法是什么?谢谢!

最佳答案

我认为您无需使用conditionalPanels.就可以以更简单的方式实现所需的功能。我们可以一次生成selectInput,然后在其他updateSelectInput更改时使用input更新它。这是一个工作示例:

library(shiny)

ui = fluidPage(
  selectInput('maxdays','Max number of days:', c(1,2,3)),
  selectInput('days','Days:',c(1))
)

server = function(input, output, session) {

  observe({
    updateSelectInput(session,'days',choices=seq(1,input$maxdays))
  })
}

runApp(shinyApp(ui = ui, server = server))

另一种解决方案是,每当第一个renderUI更改时,就使用selectInput重新渲染selectInput:
library(shiny)

ui = fluidPage(
  selectInput('maxdays','Max number of days:', c(1,2,3)),
  uiOutput('uiDays')
)

server = function(input, output, session) {

  output$uiDays <- renderUI({
    selectInput('days','Days:', choices=seq(1,input$maxdays))
  })

}

runApp(shinyApp(ui = ui, server = server))

希望这可以帮助!

关于javascript - r Shiny -带条件的conditionalPanel:选中列表中的项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48760041/

10-10 00:27