r shiny - 有条件的conditionalPanel:检查列表

时间:2018-02-13 05:30:53

标签: javascript r shiny

我有2个列表,每个列表包含多个ID p_id,条件是另一个变量d

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

我想在我的闪亮应用中添加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语法是什么?谢谢!

2 个答案:

答案 0 :(得分:2)

我认为你可以在不使用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)) 1}}改变。这是一个有效的例子:

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))

var empWithDepartments = from emp in Employee where emp.DeptId != NULL select emp.DeptId;
var result = from dep in Department where !empWithDepartments.Contains(dep.Id) select dep;

希望这有帮助!

答案 1 :(得分:2)

感谢@Florian。我修改了他的答案,这是实现理想行为的可能方法:

library(shiny)

ui = fluidPage(
  selectInput('p_id','ID:', c(111,222,333)),
  uiOutput('uiID')
)

server = function(input, output, session) {

  maxdays <- reactive({
    if(input$p_id %in% c(111)){
      x = 1
    }else{
      if(input$p_id %in% c(222)){
        x = 2
      }else
        x = 3 
    }
    return(x)
  })


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


}

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

在我的应用中,列表c(111,222,333)和相应的列表是数据集中的变量,并在脚本的开头定义。