2017-01-25 8 views
1

Я заинтересован в том, чтобы пользователь приложения мог развернуть данные, которые он хочет. Я сделал игрушечный пример, используя нижеприведенный набор данных mtcars.Добавить параметры подмножества, как того требует пользователь приложения в RShiny

runApp(
    list(
    ui = fluidPage(
     sidebarLayout(
     sidebarPanel(
      selectInput("cyl", "Select cylinders:", unique(mtcars$cyl), multiple = T, selected = unique(mtcars$cyl)), 
      selectInput("gear", "Select gears:", unique(mtcars$gear), multiple = T, selected = unique(mtcars$gear)), 
      selectInput("am", "Select am:", unique(mtcars$am), multiple = T, selected = unique(mtcars$am)), 
      numericInput("wt", "Select wt greater than:", value=1) 
      , width = 2), 

     mainPanel(

      tabsetPanel(
      tabPanel(title = "Results", dataTableOutput("tAble")) 
     ) 
     ) 
    ) 
    ) 

    , server = function(input, output, session){ 

     output$tAble <- renderDataTable({subset(mtcars, cyl %in% input$cyl & 
               gear%in%input$gear & 
               am%in%input$am & 
               wt > input$wt)}) 


    } 
) 
) 

Это приложение покажет часть фрейма данных, соответствующую всем критериям.

Моя проблема здесь в том, что я должен выписать все мои потенциальные критерии подмножества спереди. Что делать, если мои данные имеют 200 потенциальных переменных, для которых подмножество? То, что я хотел бы иметь, это иметь возможность добавлять поля подмножества по мере необходимости, не создавая selectInputs/etc спереди.

Например, когда приложение запускается, отобразите все данные. Затем у вас есть возможность добавить параметры подмножества, нажав на кнопку ?!

Любая помощь оценена!

Приветствия, Люк

+0

Вы должны использовать [динамический UI] (https://shiny.rstudio.com/articles/dynamic -ui.html). Может быть, это поможет вам начать: https://gist.github.com/wch/4211337 –

ответ

0

Для визуализации элементов пользовательского интерфейса, нужно создать tagList() элементов пользовательского интерфейса на сервере, а затем вынести их в пользовательском интерфейсе.

Затем вы должны иметь возможность подмножества данных на основе динамически создаваемых элементов пользовательского интерфейса. Здесь я оценка строки текста, на основе имен элементов пользовательского интерфейса, чтобы сделать то Подменит

library(shiny) 

runApp(
    list(
     ui = fluidPage(
      sidebarLayout(
       sidebarPanel(
        uiOutput("myChoices"), 
        numericInput("wt", "Select wt greater than:", value=1) 
        , width = 2), 

       mainPanel(

        tabsetPanel(
         tabPanel(title = "Results", dataTableOutput("tAble")) 
        ) 
       ) 
      ) 
     ) 

     , server = function(input, output, session){ 

      myCols <- names(mtcars)[1:3] 

      mySelectInputs <- tagList() 

      for(i in myCols){ 
       mySelectInputs[[i]] <- selectInput(i, label = i, choices = unique(mtcars[, i]), 
                        selected = unique(mtcars[, i]), multiple = T) 
      } 

      output$myChoices <- renderUI({ 
       mySelectInputs 
      }) 

      output$tAble <- renderDataTable({ 

       lst <- sapply(myCols, function(x){ 
        vals <- input[[x]] 
        substitute(x %in% i, list(i = vals, x = x)) 
       }) 

       txt <- gsub("\"", "", paste0(lst, collapse = " & ")) 
       print(txt) 

       subset(mtcars, eval(expr = parse(text = txt))) 

      }) 
     } 
    ) 
)