如何让我的非常简单的 Shiny App 工作?

How do I make my very simple Shiny App to work?

我是 Shiny App 的新手,我想尝试一些非常简单的东西,但我很难做到。

我有一个如下所示的数据:

  Proyecto <- c("ECO","ECO", "ECO", "ECO", "FECHIC", "FECHIC")
  Encuesta <- c(1, 2, 1,1, 1, 1)
  Visita <- c(1,2,3, 1, 1, 1)
  acep <- (1,1,1,1,1,1)
  covid_date <- c("2020-06-20", "2020-12-21", "2021-05-02", "2020-06-22", "2020-06-20", "2020-12-21")
  covid_fechic <- c(2,1,2,2,2,NA)
  BASE_COMPLETA <- tibble(Proyecto, Encuesta, Visita, acep, covid_date, covid_fechic)

我想创建一个可以作为输入的应用程序:

  1. Proyecto(select输入)
  2. Encuesta(select输入)
  3. Visita(select输入)
  4. 来自数据集的任何变量,例如 covid_date 或 covid_fechic (textInput)

根据这些输入,我想创建一个 table,首先按 Proyecto、Encuesta 和 Visita 进行过滤,然后 select 只选择我选择的变量,对其进行排列、分组,然后以一种可以向我展示变量的不同选项以及有多少人选择这些选项的方式进行总结。

没有闪亮的应用程序是这样的:

    BASE_COMPLETA %>%
      filter(Proyecto == "FECHIC") %>%
      filter(Encuesta == 1) %>%
      filter(Visita == 1) %>% 
      filter(acep == 1) %>% 
      select(covid_fechic) %>%
      arrange(covid_fechic) %>% 
      group_by(covid_fechic) %>% 
      summarise(n = n()) %>% 
      print()

但是当我在我的 Shiny App 中尝试这个时,它似乎只工作到 select 部分,我无法得到安排,group_by 或总结。

是不是因为不能多次使用同一个输入变量?

这是我非常简单的 Shiny 代码:

lista_proyecto <- c("FECHIC", "ECO")
lista_encuestas <- c(1, 2)
lista_visitas <- c(1, 2, 3)


ui <- fluidPage(
  
  theme = shinytheme("flatly"),
  
  h1(id="big-heading", "Encuesta COVID"),
  tags$style(HTML("#big-heading{color: #092F87;}")),
  
  sidebarLayout(
    sidebarPanel(
      width = 12,
      selectInput("Proyecto",
                  label = h4("Proyecto:"),
                  choices = lista_proyecto),
      selectInput("Encuesta",
                  label = h4("Encuesta:"),
                  choices = lista_encuestas),
      selectInput("Visita",
                  label = h4("Ronda:"),
                  choices = lista_visitas),
      textInput("Variable", 
                label = h4("Variable de interés"),
                value = "covid_date")
    ),
    mainPanel(
      fluidRow(DTOutput("Tabla3"))
    )
  )
)

server <- function(input, output) {
  
  output$Tabla3 <- renderDT({
    BASE_COMPLETA %>%
      filter(Proyecto == input$Proyecto) %>%
      filter(Encuesta == input$Encuesta) %>% 
      filter(Visita == input$Visita) %>% 
      filter(acep == 1) %>% 
      select(input$Variable) %>%
      arrange(input$Variable) %>% 
      group_by(input$Variable) %>% 
      summarise(n = n()) %>% 
      print()
    
  }, options = list(bFilter=0))
  
  
}

shinyApp(ui = ui, server = server)

任何人都可以帮我弄清楚问题出在哪里,我该怎么做才能让它发挥作用? 提前致谢!

知道输入的值是字符,我们可以使用特殊构造 .data[[]] 到 select 使用字符串的变量。

  output$Tabla3 <- renderDT({
    BASE_COMPLETA %>%
      filter(Proyecto == input$Proyecto) %>%
      filter(Encuesta == input$Encuesta) %>% 
      filter(Visita == input$Visita) %>% 
      filter(acep == 1) %>% 
      select(.data[[input$Variable]]) %>%
      arrange(.data[[input$Variable]]) %>% 
      group_by(.data[[input$Variable]]) %>% 
      summarise(n = n()) %>% 
      print()
    
  }, options = list(bFilter=0))

或者我们也可以使用函数 get().

有关详细信息,请参阅 Programming with dplyr

应用代码:

library(shiny)
library(DT)
library(shinythemes)

Proyecto <- c("ECO", "ECO", "ECO", "ECO", "FECHIC", "FECHIC")
Encuesta <- c(1, 2, 1, 1, 1, 1)
Visita <- c(1, 2, 3, 1, 1, 1)
acep <- c(1, 1, 1, 1, 1, 1)
covid_date <- c("2020-06-20", "2020-12-21", "2021-05-02", "2020-06-22", "2020-06-20", "2020-12-21")
covid_fechic <- c(2, 1, 2, 2, 2, NA)
BASE_COMPLETA <- tibble(Proyecto, Encuesta, Visita, acep, covid_date, covid_fechic)

lista_proyecto <- c("FECHIC", "ECO")
lista_encuestas <- c(1, 2)
lista_visitas <- c(1, 2, 3)


ui <- fluidPage(
  theme = shinytheme("flatly"),
  h1(id = "big-heading", "Encuesta COVID"),
  tags$style(HTML("#big-heading{color: #092F87;}")),
  sidebarLayout(
    sidebarPanel(
      width = 12,
      selectInput("Proyecto",
        label = h4("Proyecto:"),
        choices = lista_proyecto
      ),
      selectInput("Encuesta",
        label = h4("Encuesta:"),
        choices = lista_encuestas
      ),
      selectInput("Visita",
        label = h4("Ronda:"),
        choices = lista_visitas
      ),
      textInput("Variable",
        label = h4("Variable de interés"),
        value = "covid_date"
      )
    ),
    mainPanel(
      fluidRow(DTOutput("Tabla3"))
    )
  )
)

server <- function(input, output) {
  output$Tabla3 <- renderDT(
    {
      BASE_COMPLETA %>%
        filter(Proyecto == input$Proyecto) %>%
        filter(Encuesta == input$Encuesta) %>%
        filter(Visita == input$Visita) %>%
        filter(acep == 1) %>%
        select(.data[[input$Variable]]) %>%
        arrange(.data[[input$Variable]]) %>%
        group_by(.data[[input$Variable]]) %>%
        summarise(n = n()) %>%
        print()
    },
    options = list(bFilter = 0)
  )
}

shinyApp(ui = ui, server = server)