如何在 Shiny App 中使用多个数据集?

How can I use several data sets in Shiny App?

我有一个关于 Shiny 的问题。我有四个数据集,根据用户的输入,我想使用四个数据集之一进行计算。 我尝试使用 if 语句,但它不起作用。我也尝试过使用反应式表达式,但无法实现。我想做什么在技术上可行吗?如果是,怎么做?

ui <- fluidPage(
  
    theme = shinytheme("cerulean"),  

    titlePanel("Some Data"),

    sidebarLayout(

      sidebarPanel(
            
            checkboxGroupInput("checkGroup", label = h3("Choose your tea brand:"), 
                               choices = list("Solar" = 1, 
                                              "Green" = 2, 
                                              "Cat" = 3, 
                                              "Conservation" = 4)),

           selectInput("tea", "Choose your tea:", c("Green Tea", "Black Tea", "Blue Tea")
            
        ),

        mainPanel(
        
          tabsetPanel(
            tabPanel("Titel",
              
            h4("Subtitel"),
            verbatimTextOutput("demographicsTable"),
            
            h4("Subtitel"),
            tableOutput("nbhsizeTable"),
            ))))

server <- function(input, output) {

      if(input$checkGroup == "Solar"){
        Data <- read.csv("SolarData.csv")
      } else if(input$checkGroup == "Green"){
        Data <- read.csv("GreenData.csv")
      } else if(input$checkGroup == "Conservation"){
        Data <- read.csv("ConservationData.csv")
      } else if(input$checkGroup == "Cat"){
        Data <- read.csv("CatData.csv")
      }

  output$demographicsTable <- renderPrint({
              
      dat <- Data %>% filter(grepl(input$tea, cookies))  
        
        ### age
        age <- summary(dat$age)
        
        ### gender
        gender <- table(dat$gender)
        
        dat <- list(Age = c(age[1], age[4], age[6]), 
                    Gender = gender)
        dat

    })
    
    output$nbhsizeTable <- renderTable({
              
        dat <- Data %>% filter(grepl(input$tea, cookies))
        
        table(dat$size_of_teacup)

    })

这里发生了一些事情。

首先,我认为最大的部分是 input$checkGroup returns 选择列表中的值,而不是向用户显示的 labels/names。它还returns这个值作为一个字符串,即当用户选择“Solar”时,服务器将看到一个输入值“1”。

其次,您的 Data 变量需要是反应性的。现在,您的 if/else 语句将在启动时执行,而不会再执行。由于您未指定初始选择,因此输入值将为 NULL,不匹配任何条件语句,并且不会为 Data.

分配任何值

我会按照这个思路做一些事情。将您的数据集加载到静态列表中(这将防止每次用户 adds/removes 检查时从磁盘读取)

teaData <- list(
  read.csv("SolarData.csv"),
  read.csv("GreenData.csv"),
  read.csv("CatData.csv"),
  read.csv("ConservationData.csv")
)

然后创建一个反应式,通过强制输入值并根据选择组合它们来对该列表进行子集化

Data <- reactive({
  dplyr::bind_rows(teaData[as.integer(input$checkGroup)])
})

没有样本数据我无法真正测试解决方案,但我认为解决方案足够简单,应该可行。