#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)
- Вы уверены, что хотите получить результат в виде 0 num? Пожалуйста, имейте в виду, что в случае, если вы используете 100 в качестве значения фильтра, результатом
df %>% filter(height == 100) %>% select(weight)
будет adata.frame
. Нетnum
. - Даже если вы используете
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()