如何使用R Shiny

时间:2019-04-30 23:46:42

标签: r shiny

我对R并不陌生,但对R-Shiny并不陌生,并且正在尝试构建一个查询数据的应用程序(我不知道是否有一个更好的术语来描述我要做什么。)

从本质上讲,该应用程序使用UI中的输入存在一系列问题,然后应将其范围缩小以匹配用户的特定首选项。我一直把它称为“嗡嗡声测验”,因为我能想到的最非技术性的东西也能做到这一点。无论如何,我可能付出了很多努力,因为我在使代码中的语法正确以使其无法查询一个问题时遇到了麻烦。我认为一旦找到工作,我就应该能够解决其他问题。

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以根据用户在UI中单击的内容以及其在其背后的代码中附加的内容将我的数据集简化为。如果此人选择3到5个人,我希望它可以将数据集简化为只有两个到六个座位的车辆。目前,该应用程序什么也不做。用户界面工作正常,但是操作按钮不执行任何操作。

1 个答案:

答案 0 :(得分:0)

由于未提供可复制的示例,因此我将使用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)解析。

您可以使用以下命令检查ID为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: what is the difference between observeEvent and eventReactive?,您需要使用actionButton()而不是observeEvent()来观察eventReactive()的事件。