0

用户可以选择 的一些变量mtcars,选择这些变量后,继续选择每个变量的水平。最后,我如何在他们选择每个变量的级别后返回过滤器数据

dt <- reactive({data <- dt %>% filter(.....) %>% filter(.....) ....and so on}),如何使用 %>% 循环或映射来过滤数据?

我很感激你的时间。

library(shiny)
library(dplyr)

ui <- fixedPage(
  h2("Example"),
  uiOutput("var"),
  uiOutput("test")
)

server <- function(input, output, session) {
  
  dt <- mtcars[, c(2, 8:11)]
  dt[] <- lapply(dt, factor)
  
  output$var <- renderUI({
    selectInput("var", "Select Variable", choices = names(dt), multiple = T)
  })
  
 level <- reactive({
   choice <- select(dt, input$var)
   print(choice)
 })
  
  output$test <- renderUI({
    lapply(seq_along(input$var), function(i) {
      selectInput(paste0("level",i), paste0("Select Levels of ", input$var[[i]]), choices =  unique(level()[[i]]), multiple = T)
    })
  })
  
  dt <- reactive({
   data <- dt %>% filter(.....)  %>% filter(.....) ....and so on
  })

}

shinyApp(ui, server)
4

1 回答 1

2

这可以通过purrr::reduce. 试试这个:

library(shiny)
library(dplyr)
library(purrr)

ui <- fixedPage(
  h2("Example"),
  uiOutput("var"),
  uiOutput("test"),
  tableOutput("data")
)

server <- function(input, output, session) {
  
  dt <- mtcars[, c(2, 8:11)]
  dt[] <- lapply(dt, factor)
  
  output$var <- renderUI({
    selectInput("var", "Select Variable", choices = names(dt), multiple = T)
  })
  
  level <- reactive({
    choice <- select(dt, input$var)
    print(choice)
  })
  
  output$test <- renderUI({
    lapply(seq_along(input$var), function(i) {
      selectInput(paste0("level", i), paste0("Select Levels of ", input$var[[i]]), choices =  unique(level()[[i]]), multiple = T)
    })
  })
  
  data <- reactive({
    purrr::reduce(seq_along(input$var), ~ filter(.x, !!sym(input$var[[.y]]) %in% input[[paste0("level", .y)]]), .init = dt)
  })
  
  output$data <- renderTable({
    data()
  })
  
}

shinyApp(ui, server)
于 2020-07-26T19:52:31.503 回答