如何在 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)])
})
没有样本数据我无法真正测试解决方案,但我认为解决方案足够简单,应该可行。
我有一个关于 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)])
})
没有样本数据我无法真正测试解决方案,但我认为解决方案足够简单,应该可行。