2016-06-17 2 views
1

Я пытаюсь загрузить файл CSV, а затем взять столбец (фактор) этого CSV-файла и создать пользовательский ввод, чтобы определить, какое из уникальных имен в этом поле будут выбраны для кадра данных.Фильтрация из selectInput in R shiny

Так что, если у меня есть следующий пример data.frame:

COURSE VALUE 
1  A  7 
2  C  2 
3  C  2 
4  B  9 
... 

Я хочу, чтобы фильтровать с помощью Select_Input, и пользователь может выбрать выбрать скажем А и С, а кадр данных будет фильтроваться для всего строк с а и С. Ниже приведен код для создания пользовательского интерфейса для select_Input

output$choose_course<-renderUI{ 
# If missing input, return to avoid error later in function 
if(is.null(input$model.input)) 
return() 

# Get the data set with the appropriate name 
course.names <-c("All",as.vector(t(unique(select_(model.data0(),"COURSE"))))) 

selectInput("courses","Choose courses", choices=course.names, multiple=TRUE)  
} 

Обратите внимание, что model.data0() является реакционноспособные данные, введенные пользователем с помощью файла .csv. Эта первая часть кода работает нормально (но, может быть, формат запутывает следующий материал?) И отображает выбор пользователя. А рядом есть моя попытка фильтрации от selectInput ...

model.data<-reactive({ 
if(is.null(input$model.input)) 
    return() 

localdata<-model.data0() 
if(input$courses!="All"){ 
    localdata<-localdata[localdata$COURSE==unlist(input$courses),] 
} 
}) 

Однако это возвращает ошибку «аргумент 1 (тип„список“) не может быть обработан с помощью„кошки“». Я попробовал список выше, чтобы изменить его на вектор, но, похоже, не работал. Любые идеи, как я могу сделать этот фильтр моими данными?

+0

Извинения, кажется, что я не правильно форматировать вывод для моего тестирования, и именно там я получаю сообщение об ошибке с. –

ответ

2

Вы могли бы попытаться сделать это:

require(shiny) 

ui <- fluidPage( 
    sidebarLayout(
    sidebarPanel(
     uiOutput('choose_course') 
    ), 
    mainPanel(
     tableOutput('courseTable') 
    ) 
) 
) 

server <- function(input, output, session) { 
    # Build data, would be replaced by the csv loading in your case 
    n <- 10 
    model.data0 <- reactive ({ 
    data.frame("COURSE" = sample(LETTERS[1:3], n, replace=TRUE), 
       "VALUE" = sample(1:10, n, replace=TRUE)) 
    }) 

    # Render selectInput 
    output$choose_course <- renderUI({ 
    course.names <- as.vector(unique(model.data0()$COURSE)) 
    selectInput("courses","Choose courses", choices=course.names, multiple=TRUE)  
    }) 

    # Subset so that only the selected rows are in model.data 
    model.data <- reactive({ 
    subset(model.data0(), COURSE %in% input$courses) 
    }) 

    output$courseTable <- renderTable({ model.data() }) 
} 
runApp(shinyApp(ui,server)) 
+0

Спасибо вам большое! Я буду помнить об этом в будущем, поскольку у меня есть моя программа. –

+0

Рад, что я могу помочь, я пропустил ваш комментарий, поэтому я отправил anwser в первую очередь. Никакого вреда не было. –

Смежные вопросы