Фильтровать фрейм данных в R Shiny

#r #shiny

#r #блестящий

Вопрос:

У меня есть фрейм данных:

 height <- c('100', '101','102')
weight <- c('40 ', '45', '58')

df <- data.frame(height, weight)

df    
  height weight
1    100     40 
2    101     45
3    102     58
  

Теперь я хочу выполнить поиск, например, 100 и отобразить 40, и если я найду 102, результат будет 58.

У меня есть следующее:

 df %>%
  filter(height == input$counter) %>%
  select(weight)
  

Который работает, но если ввести, например, 5 любого другого числа, которого нет в df $ height, тогда я получу это:

 > df %>%
   filter(height == input$counter) %>%
   select(weight)
[1] weight
<0 rows> (or 0-length row.names)
  

input$counter Это ui.R входные данные. Результат в shiny работает, но если входные данные не найдены в height df, тогда они будут отображаться numeric(0) . Как я могу сделать так, чтобы вывод был 0 вместо numeric(0) ?

Ответ №1:

Это возможное решение:

     # library
    library(shiny)
    library(dplyr)
    # data frame
    height <- c('100', '101','102')
    weight <- c('40 ', '45', '58')
    df <- data.frame(height, weight)


    ui <- shinyUI(fluidPage(


       titlePanel("Filter data frame"),


       sidebarLayout(
          sidebarPanel(
             textInput("counter",
                         "Select:"
                         )
          ),


          mainPanel(
             verbatimTextOutput("selectedData")
          )
       )
    ))

    server <- shinyServer(function(input, output) {

       output$selectedData <- renderPrint({
            if (input$counter %in% df$height) {
                   df %>% filter(height == input$counter) %>% 
               select(weight)
            } else {
                    return(data.frame(weight = 0));
            }
       })
    })


    shinyApp(ui = ui, server = server)
  

Ответ №2:

Предупреждение:

Как я могу сделать так, чтобы вывод был равен 0 вместо числового (0)

  1. Вы уверены, что хотите получить результат в виде 0 num? Пожалуйста, имейте в виду, что в случае, если вы используете 100 в качестве значения фильтра, результатом df %>% filter(height == 100) %>% select(weight) будет a data.frame . Нет num .
  2. Даже если вы используете data.frame(weight = 0) вместо 0, у вас могут возникнуть проблемы, если вы не используете options(stringsAsFactors = FALSE) по умолчанию.

Решение:

Я бы представил функцию на случай, если вы будете настаивать на 0 как num, как указано в вопросе:

zero_if_empty <- function(val){
if(dim(val)[1]==0) 0 else val
}

или аналогично предложению Вальтера:

zeroDF_if_empty <- function(val){
if(dim(val)[1]==0) data.frame(weight = 0) else val
}

Результирующий оператор в вашем примере будет изменен следующим образом:

df %>%
filter(height == input$counter) %>%
select(weight) %>%
zeroDF_if_empty()