从 conditionalPanel 获取输入值

Get input values from conditionalPanel

我正在尝试生成一个闪亮的应用程序,它首先允许用户(使用 dplyr 动词的概念)select 他们感兴趣的变量,然后根据后续 select离子。我正在尝试使用 conditionalPanel() 来执行此操作,但我无法找到一种方法来从每个条件面板访问 input$

这是一个例子:

library('shiny')
library('tidyverse')
library('shinyWidgets')

#Create the data
data <- select(mtcars, c(gear, carb))

#Create page with sidebarlayout
ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      
      #Create picker input where relevant variables are selected
      pickerInput(
        inputId = 'vars', 
        label = 'Variables', 
        choices = colnames(data), 
        selected = colnames(data), 
        multiple = T, 
        pickerOptions(actionsBox = TRUE)
      ),
    
      #Create conditional panels which show when the variable above is selected
      #These panels will be used to filter the data that is selected based on the above variables
      conditionalPanel(condition = "input.vars.includes('gear')", 
                     pickerInput(inputId = 'gear', 
                                 label = 'Gear', 
                                 choices = unique(data$gear),
                                 selected = unique(data$gear), 
                                 multiple = T, 
                                 pickerOptions(actionsBox = TRUE)
                      )
      ), 
      conditionalPanel(condition = "input.vars.includes('carb')",
                     pickerInput(inputId = 'carb',
                                 label = 'Carb',
                                 choices = unique(data$carb),
                                 selected = unique(data$carb),
                                 multiple = T,
                                 pickerOptions(actionsBox = TRUE)
                      )
    )
    ), 
  
  mainPanel(
    #Show the selected data
    verbatimTextOutput('term_selected'), 
    #Show the selected and filtered data - this won't show
    verbatimTextOutput('term_selected_filtered'),
    #Try debug with just getting the 
    verbatimTextOutput('debug_print')
  )
    
  )
)
  
server <- function(input, output) {
  #Create the reactive selected data
  selected_data <- reactive ({
    data %>% 
      select(input$vars)
  })
  
  #Render the selected data
  output$term_selected <- renderPrint(selected_data())
  
  #This is where i am stuck
  #I need to find a way to access the inputs related to the conditional functions
  # selected_filtered_data <- reactive ({
  #   for (i in length(input$vars)) {
  #     selected_data() %>%
  #       filter(input$[first condiitonal panel select] %in% as.symbol(input$vars[i])
  #   }
  # })
  # 
  output$term_selected_filtered <- renderPrint(selected_filtered_data())
  
  #Try to render input input$[first item of input.vars]
  output$debug_print <- renderPrint(input$as.symbol(input$vars[1]))
  
}
  
shinyApp(ui = ui, server = server)

问题出在服务器上。我已经尝试 input$as.symbol(input$vars[1]) 访问 input$gear(假设是 selected),但它只是抛出错误:attempt to apply non-function。我尝试在 as.symbol() 前面添加 !! 作为语法糖,但这没有什么区别。

我也尝试过这个,希望能有条件地过滤,但没有成功。

  selected_filtered_data <- reactive({
    selected_data() %>%
      if('gear' %in% input$vars) {
        filter(gear %in% input$gear) %>%
      }
      if('carb' %in% input$vars) {
        filter(carb %in% input$carb)
      }
  })

我应该怎么做?

我们可以使用 across(如果我们想在两个列条件都为真时 filter 行)或将 across 替换为 if_any(如果其中任何一个当它们都被选中时它们是 TRUE)

selected_data() %>%
         filter(across(all_of(intersect(input$vars,
        c('gear', "carb"))), ~ .x %in% input[[cur_column()]]))

-完整代码

library('shiny')
library('dplyr')
library(tidyr)
library('shinyWidgets')

#Create the data
data <- select(mtcars, c(gear, carb))

#Create page with sidebarlayout
ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      
      #Create picker input where relevant variables are selected
      pickerInput(
        inputId = 'vars', 
        label = 'Variables', 
        choices = colnames(data), 
        selected = colnames(data), 
        multiple = TRUE, 
        pickerOptions(actionsBox = TRUE)
      ),
      
      #Create conditional panels which show when the variable above is selected
      #These panels will be used to filter the data that is selected based on the above variables
      conditionalPanel(condition = "input.vars.includes('gear')", 
                       pickerInput(inputId = 'gear', 
                                   label = 'Gear', 
                                   choices = unique(data$gear),
                                   selected = unique(data$gear), 
                                   multiple = T, 
                                   pickerOptions(actionsBox = TRUE)
                       )
      ), 
      conditionalPanel(condition = "input.vars.includes('carb')",
                       pickerInput(inputId = 'carb',
                                   label = 'Carb',
                                   choices = unique(data$carb),
                                   selected = unique(data$carb),
                                   multiple = TRUE,
                                   pickerOptions(actionsBox = TRUE)
                       )
      )
    ), 
    
    mainPanel(
      #Show the selected data
      verbatimTextOutput('term_selected'), 
      #Show the selected and filtered data - this won't show
      verbatimTextOutput('term_selected_filtered'),
      #Try debug with just getting the 
      verbatimTextOutput('debug_print')
    )
    
  )
)

server <- function(input, output) {
  #Create the reactive selected data
  selected_data <- reactive ({
    req(input$vars)
    data %>% 
      select(input$vars)
  })
  
  #Render the selected data
  output$term_selected <- renderPrint(selected_data())
  
  #This is where i am stuck
  #I need to find a way to access the inputs related to the conditional functions
   selected_filtered_data <- reactive ({
     
       
       
       selected_data() %>%
         filter(across(all_of(intersect(input$vars, c('gear', "carb"))), ~ .x %in% input[[cur_column()]]))
     
   })
  # 
  output$term_selected_filtered <- renderPrint(
    
       selected_filtered_data()
       )
  
  output$debug_print <- renderPrint(input[[input$vars[1]]])

}

shinyApp(ui = ui, server = server)

-输出