Используйте блестящий ввод текста и dplyr для фильтрации строк во фрейме данных

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

Набор данных

df1<-data.frame (Name=c("Carlos","Pete","Carlos","Carlos","Carlos","Pete","Pete","Pete","Pete","Homer"),Sales=(as.integer(c("3","4","7","6","4","9","1","2","1","9"))))

UI

shinyUI(fluidPage(
titlePanel("Sales trends"),titlePanel("People score"),

sidebarLayout(sidebarPanel(

  textInput("text", label = h3("Text input"), value = "Enter text..."),

  numericInput("obs", "Number of observations to view:", 3),

  helpText("Note: while the data view will show only the specified",
           "number of observations, the summary will still be based",
           "on the full dataset."),

  submitButton("Update View")
),

mainPanel(
  h4("Volume: Total sales"),
  verbatimTextOutput("volume"),

  h4("Top people"),
  tableOutput("view")
))))

Сервер

library(shiny)
library (dplyr)
df1<-data.frame (Name=c("Carlos","Pete","Carlos","Carlos","Carlos","Pete","Pete","Pete","Pete","Homer"),Sales=(as.integer(c("3","4","7","6","4","9","1","2","1","9"))))
shinyServer(function(input, output) {
output$value <- renderPrint({ input$text })
datasetInput <- reactive({
switch(input$dataset,df1%>% filter(Name %in% "input$text")%>% select(Name, Sales)%>% arrange(desc(Sales)))
})
output$volume <- renderPrint({
dataset <- datasetInput()
sum(dataset$Sales)
})})

person Blas    schedule 29.09.2015    source источник
comment
Может быть, попробовать удалить кавычки из input$text внутри filter?   -  person aosmith    schedule 29.09.2015


Ответы (2)


Как указал aosmith, вам нужно удалить кавычки для фильтрации. Во-вторых, вы должны использовать == вместо %in% внутри filter(). В-третьих, вы могли бы использовать switch() в других случаях (читайте на ?switch), но здесь он вам не нужен.

Ваш server.R должен выглядеть так:

library(shiny)
library(dplyr)
df1 <- data_frame(Name = c("Carlos","Pete","Carlos","Carlos","Carlos","Pete",
                         "Pete","Pete","Pete","Homer"),
                  Sales = c(3, 4, 7, 6, 4, 9, 1, 2, 1, 9))

shinyServer(function(input, output) {
  datasetInput <- reactive({
    df1 %>% filter(Name == input$text) %>% arrange(desc(Sales))
  })
  output$volume <- renderPrint({
    dataset <- datasetInput()
    dataset$Sales
  })
})
person Thomas K    schedule 29.09.2015
comment
попытка запустить OP ui.R вместе с этим server.R, который вы предоставили, просто дает мне Error: no applicable method for 'filter_' applied to an object of class "function" ошибки. - person Monica Heddneck; 13.01.2017
comment
Вам необходимо определить данные в server.R. Я пропустил эту часть, но обновил свои ответы, чтобы отразить это. - person Thomas K; 13.01.2017
comment
Спасибо за ответ! Теперь я получаю Warning: Error in switch: EXPR must be a length 1 vector при запуске приложения. - person Monica Heddneck; 13.01.2017
comment
@MonicaHeddneck, вы перезапустили сеанс r и загрузили только эти два пакета? не могли бы вы попытаться отследить, где и когда возникает ошибка? Как вы запускаете приложение? - person Thomas K; 13.01.2017

когда вы фильтруете свои собственные поисковые слова,
1. выполните функцию обновления с помощью: reactive
2. введите функцию в renderDT

ui = fluidPage(
        textInput('qry', 'Species', value='setosa'),
        DT::DTOutput('tbl'))
server = function(input, output){
        a = reactive({ filter(iris, Species == input$qry })
        output$tbl = renderDT(a())
shinyApp(ui,server)

удачи!

person hyunwoo jeong    schedule 20.09.2019