Как запросить данные, используя операторы if / else в R блестящий - PullRequest
0 голосов
/ 01 мая 2019

Я не новичок в R, но я новичок в R-Shiny и пытаюсь создать приложение, которое запрашивает данные (я не знаю, есть ли лучший термин для описания того, что я пытаюсь сделать).

По сути, у приложения есть ряд вопросов с использованием входных данных в пользовательском интерфейсе, который затем должен сузить данные в соответствии с конкретными предпочтениями пользователя.Я называю это «викторина с жужжанием», потому что эта самая нетехническая вещь, о которой я могу подумать, делает то же самое.Несмотря на это, я мог откусить больше, чем могу прожевать, потому что у меня возникают проблемы с правильным синтаксисом в моем коде, чтобы он мог задавать даже один вопрос.Я думаю, что как только я заставлю одного работать, я смогу ответить на другие вопросы.

UI <-fluidpage(
    tabPanel(
      "Find My AVF",
      headerPanel("What Your AVF Match?"),
  radioButtons(inputId = "q1", label = h3("How many people are in your household?"),
               choices = list("1 to 2" = 1, "3 to 5" = 2, "6 to 7" = 3, "8" = 4, "9 or more" = 5), 
               selected = 1),
  actionButton("execute", label = "Find my Perfect Car!"),
  tableOutput("resulttable")
    )

server <- function(input,output){
  q1a <- reactive({
    if (input$q1 == "1 to 2"){
      q1dat <- Seats < 6
    } else if (input$q1 == "3 to 5") {
      q1dat <- Seats > 2 & Seats < 6
    } else if (input$q1 == " 6 to 7") {
      q1dat <- Seats > 5 
    } else if (input$q1 == "8"){
      q1dat <- Seats > 7 
    } else if (input$q1 == "9 or more") {
      q1dat <- Seats = 9
    }
  })
  result <- eventReactive(input$execute, {
    output$resulttable <- renderTable(q1a
    )
  })
  }

Я надеялся просто заставить R сократить мой набор данных до уровня, основанного на том, что пользователь нажимает в пользовательском интерфейсе, и на чем он привязан в коде, стоящем за ним.Если человек выбирает от 3 до 5 человек, я хочу, чтобы набор данных был доступен только для транспортных средств, которые имеют от двух до шести мест.В настоящее время приложение ничего не делает.Пользовательский интерфейс работает нормально, но кнопка действия не выполняет никаких действий.

1 Ответ

0 голосов
/ 01 мая 2019

Поскольку воспроизводимый пример не был предоставлен, я буду использовать набор данных mtcars для демонстрации рабочего примера:

library(shiny)
library(dplyr)

ui <-fluidPage(
  tabPanel(
    "Find My AVF",
    headerPanel("What Your AVF Match?"),
    radioButtons(inputId = "q1",
                 label = h3("How many people are in your household?"),
                 choices = list(
                   "1 to 2" = 1,
                   "3 to 5" = 2,
                   "6 to 7" = 3,
                   "8" = 4,
                   "9 or more" = 5
                   ), 
                 selected = 1),
    actionButton("execute", label = "Find my Perfect Car!"),
    tableOutput("resulttable")
  ))

  server <- function(input,output){
    q1a <- reactive({
      if (input$q1 == 1){
        q1dat <- mtcars %>%
          filter(cyl < 6)
      } else if (input$q1 == 2) {
        q1dat <- mtcars %>%
          filter(cyl > 2 & cyl < 6)
      } else if (input$q1 == 3) {
        q1dat <- mtcars %>%
          filter(cyl > 5 )
      } else if (input$q1 == 4){
        q1dat <- mtcars %>%
          filter(cyl > 7 )
      } else if (input$q1 == 5) {
        q1dat <- mtcars %>%
          filter(cyl == 9)
      }
      return(q1dat)
    })
    observeEvent(input$execute, {
      output$resulttable <- renderTable(q1a())
    })
  }

shinyApp(ui, server)

Некоторые проблемы не позволяют вашему приложению работать должным образом.Ваш пример трактует Seats как набор данных, где я предполагаю, что это переменная в другом наборе данных, которая заменяется на mtcars и на переменную cyl из этого примера.Вы должны поднастроить свой набор данных, используя соответствующее условие.Ваша реактивная функция q1a также не возвращает значение при вызове, разрешается с помощью return(q1dat) после ваших управляющих операторов.

Ваш вход с идентификатором q1 может быть проверен с помощью:

radioButtons(inputId = "q1",
                label = h3("How many people are in your household?"),
                choices = list(
                  "1 to 2" = 1,
                  "3 to 5" = 2,
                  "6 to 7" = 3,
                  "8" = 4,
                  "9 or more" = 5
                  ), 
                selected = 1)

Вы увидите, что value каждой кнопки представляет собой число от 1 до 5. Это значение, которое необходимо проверить в своих управляющих операторах.

Наконец, для Shiny: что такоеразница между наблюдаемыми событиями и событиями? , вам нужно наблюдать событие actionButton() с observeEvent() вместо eventReactive().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...