Как связать выход из блестящего selectInput с датабельной - PullRequest
0 голосов
/ 28 февраля 2020

Я относительно новичок в R и в настоящее время пытаюсь создать простое приложение Shiny.

Я считаю, что ввод хороший, но мой вывод не работает должным образом.

Мое приложение должно позволять пользователям выбирать количество ингредиентов, которые они хотят использовать, а на выходе должны быть указаны все названия рецептов с указанным c количеством ингредиентов.

Как подключить вход на нужный выход?

ui <- fluidPage(
  titlePanel("Foodify"),

  #Input
  selectInput("number_of_ingredients", "How many ingredients would you like to use?",
              choices = c(dt.ingredients.and.directions.recipe$dt.number.of.ingredients), selected = 5, selectize = TRUE),
  mainPanel(textOutput("ingredients")
))

server <- function(input, output){
  ingredients.data <- reactive({as.data.frame(dt.ingredients.and.directions.recipe)})

  recipes <- reactive(ingredients.data()[which(row.names(ingredients.data()) == input$number_of_ingredients),])

  output$ingredients <- renderPrint({ingredients.data()$Recipe_name})
}

shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 28 февраля 2020

Я думаю, вы могли бы упростить ваше приложение.

У вас были данные рецепта как 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...