Я думаю, вы могли бы упростить ваше приложение.
У вас были данные рецепта как reactive
- это нужно? Если ваши данные уже представлены во фрейме данных, вы можете отфильтровать их либо в отдельном блоке reactive
, либо в вашем output
.
. Вот краткий пример, который упрощает вещи (фильтрация вашего фрейма данных в output
). Если ваши input
изменятся (разное количество рецептов), текстовый вывод автоматически обновится.
Будет ли это соответствовать вашим потребностям?
dt.ingredients.and.directions.recipe <- data.frame(
dt.number.of.ingredients = c(1,2,3),
Recipe_name = c("First", "Second", "Third"),
stringsAsFactors = F
)
ui <- fluidPage(
titlePanel("Foodify"),
#Input
selectInput("number_of_ingredients", "How many ingredients would you like to use?",
choices = unique(dt.ingredients.and.directions.recipe$dt.number.of.ingredients),
selected = 1,
selectize = TRUE),
mainPanel(textOutput("ingredients")
)
)
server <- function(input, output){
output$ingredients <- renderPrint({
dt.ingredients.and.directions.recipe[dt.ingredients.and.directions.recipe$dt.number.of.ingredients == input$number_of_ingredients, "Recipe_name"]
})
}
shinyApp(ui = ui, server = server)
Если вы хотите использовать отдельный reactive
Блок для фильтрации вы также можете сделать следующее:
server <- function(input, output){
recipes <- reactive({
dt.ingredients.and.directions.recipe[dt.ingredients.and.directions.recipe$dt.number.of.ingredients == input$number_of_ingredients,]
})
output$ingredients <- renderPrint({
recipes()$Recipe_name
})
}
Редактировать (3/1/20) :
Существует гибкость в том, как могут отображаться результаты вашего рецепта , Прямо сейчас он использовал renderPrint
, который просто захватывает любой вывод на печать и преобразует его в строку.
Существует несколько альтернативных способов отображения ваших данных. Один из способов - использовать renderTable
вместо (и в вашем ui
заменить на tableOutput
вместо textOutput
. Также взгляните на пакет DT
в глянцевом виде.
Это покажет рецепт приводит к одному столбцу:
library(shiny)
dt.ingredients.and.directions.recipe <- data.frame(
dt.number.of.ingredients = c(7,2,7,8,6),
Recipe_name = c("Jam Toaster Tarts", "Oven-Dried Strawberries", "Fried Whole Fish", "Veggie Italian Hoagies", "Buttered Tomatoes with Ginger"),
stringsAsFactors = F
)
ui <- fluidPage(
titlePanel("Foodify"),
#Input
selectInput("number_of_ingredients", "How many ingredients would you like to use?",
choices = sort(unique(dt.ingredients.and.directions.recipe$dt.number.of.ingredients)),
selected = 1,
selectize = TRUE),
mainPanel(tableOutput("ingredients")
)
)
server <- function(input, output){
output$ingredients <- renderTable({
data.frame(Recipe = dt.ingredients.and.directions.recipe[dt.ingredients.and.directions.recipe$dt.number.of.ingredients == input$number_of_ingredients, "Recipe_name"])
})
}
shinyApp(ui = ui, server = server)