R Shiny --> 基于虚拟变量的 SelectInput 创建箱线图
R Shiny --> Create a Boxplot based on SelectInput of Dummy Variables
我正在尝试构建一个 R Shiny 仪表板,用于显示我的锻炼数据的几页。我被困在如何为箱线图的仪表板编写代码,显示每个培训师燃烧的卡路里分布。我想要发生的是有一个 selectInput 允许用户从培训师列表中 select 并且这个 selection 将更新箱线图。但是,变量 selected 将是一个虚拟变量,其中我将 selected 培训师箱线图与 "All other" 培训师并排比较。
这是我的数据集的示例:
VisitNum VisitNumMonth Date ClassLength Calories AvgHR Location Trainer Visits_Trainer
1 1 12/15/19 56 602 128 A Mike 4
2 1 12/16/19 55 610 130 A Mike 4
3 2 01/04/20 52 550 120 A Sally 2
4 2 01/05/20 61 575 134 B Jennie 5
5 2 01/10/20 57 654 133 A Tim 1
6 2 01/17/20 55 592 119 A Rachael 1
7 3 02/04/20 50 632 129 B Jennie 5
8 3 02/22/20 48 630 125 B Jennie 5
9 3 02/28/20 59 609 136 B Marshall 6
10 4 03/03/20 53 598 134 A Mike 4
这是我的代码:
library(RSQLite)
library(sqldf)
library(shiny)
library(shinydashboard)
library(DT)
library(ggplot2)
library(shiny)
data=as.data.frame(read_excel("mydata.xlsx",sheet=1))
#Create "Other" value for Trainers with less than 3 visits
data$Trainer2=ifelse(data$Visits_Trainer>=3,data$Trainer,"Other")
#Remove "Other" as possible selection in SelectInput
TrainerChoices=unique(data$Trainer2)
TrainerChoices=TrainerChoices[!TrainerChoices %in% "Other"]
Table1=sqldf("select VisitNum as 'Visit #', Date, Location as 'Studio', Trainer, Calories, AvgHR
from data
group by VisitNum, Date, Location, Trainer")
# Define UI for application
ui <- fluidPage(
titlePanel("Exercise Data Analysis"),
dashboardPage(
dashboardHeader(title=""),
dashboardSidebar(
sidebarMenu(
menuItem("All Data",
tabName = "AllData",
icon=icon("table")
),
menuItem("Trainer Boxplots",
tabName = "trainbox",
icon=icon("dumbbell")
),
selectInput(inputId = "trainerselect",label="Select a Trainer:",choices=TrainerChoices)
)
),
dashboardBody(
tabItems(
tabItem(
tabName = "AllData",
DTOutput("alldata")
),
tabItem(
tabName = "trainbox",
plotOutput("trainbox")
))
)
)
)
# Define server logic
server <- function(input, output) {
#----------ALL DATA TABLE----------#
output$alldata=renderDT({
datatable(Table1,options=list(pageLength=10,
lengthMenu=c(10,15,20,25)
),rownames = FALSE)
})
#---------- TRAINER BOXPLOTS ----------#
TrainData=reactive({
NewDummy=ifelse(data$Trainer2==input$TrainerChoices,input$TrainerChoices,"Other")
return(NewDummy)
})
output$trainbox=renderPlot({
plot=ggplot(TrainData(),aes(y=Calories,x=as.factor(NewDummy)))+geom_boxplot(aes(col=as.factor(NewDummy)))
plot
})
}
# Run the application
shinyApp(ui = ui, server = server)
当我 运行 此代码时,“所有数据”选项卡显示得很好,但我无法让 Trainer Boxplots 正确显示。该页面出现错误,内容为:
`data` must be a data frame, or other object coercible by `fortify()`, not a logical vector
有人可以帮我指明正确的方向吗?任何帮助,将不胜感激!谢谢!
我不确定这是否是您想要的,但也许这会有所帮助。
首先,你的selectInput
在ui
的id是trainerselect
,所以你需要通过input$trainerselect
访问,而不是TrainerChoices
。
您的 TrainData
反应式表达式将 return 一个字符值(培训师姓名或 "Other");我假设您想使用 data
作为您的数据源,而不是这个。 NewDummy
是反应式表达式中的局部变量。也许这就是您想要的 TrainData()
.
如果我是 mistaken/confused,请告诉我。
server <- function(input, output) {
#----------ALL DATA TABLE----------#
output$alldata=renderDT({
datatable(Table1,options=list(pageLength=10,
lengthMenu=c(10,15,20,25)
),rownames = FALSE)
})
#---------- TRAINER BOXPLOTS ----------#
TrainData=reactive({
NewDummy=ifelse(data$Trainer2==input$trainerselect,input$trainerselect,"Other")
return(NewDummy)
})
output$trainbox=renderPlot({
NewDummy <- TrainData()
plot=ggplot(data,aes(y=Calories,x=as.factor(NewDummy)))+
geom_boxplot(aes(col=as.factor(NewDummy)))
plot
})
}
我正在尝试构建一个 R Shiny 仪表板,用于显示我的锻炼数据的几页。我被困在如何为箱线图的仪表板编写代码,显示每个培训师燃烧的卡路里分布。我想要发生的是有一个 selectInput 允许用户从培训师列表中 select 并且这个 selection 将更新箱线图。但是,变量 selected 将是一个虚拟变量,其中我将 selected 培训师箱线图与 "All other" 培训师并排比较。
这是我的数据集的示例:
VisitNum VisitNumMonth Date ClassLength Calories AvgHR Location Trainer Visits_Trainer
1 1 12/15/19 56 602 128 A Mike 4
2 1 12/16/19 55 610 130 A Mike 4
3 2 01/04/20 52 550 120 A Sally 2
4 2 01/05/20 61 575 134 B Jennie 5
5 2 01/10/20 57 654 133 A Tim 1
6 2 01/17/20 55 592 119 A Rachael 1
7 3 02/04/20 50 632 129 B Jennie 5
8 3 02/22/20 48 630 125 B Jennie 5
9 3 02/28/20 59 609 136 B Marshall 6
10 4 03/03/20 53 598 134 A Mike 4
这是我的代码:
library(RSQLite)
library(sqldf)
library(shiny)
library(shinydashboard)
library(DT)
library(ggplot2)
library(shiny)
data=as.data.frame(read_excel("mydata.xlsx",sheet=1))
#Create "Other" value for Trainers with less than 3 visits
data$Trainer2=ifelse(data$Visits_Trainer>=3,data$Trainer,"Other")
#Remove "Other" as possible selection in SelectInput
TrainerChoices=unique(data$Trainer2)
TrainerChoices=TrainerChoices[!TrainerChoices %in% "Other"]
Table1=sqldf("select VisitNum as 'Visit #', Date, Location as 'Studio', Trainer, Calories, AvgHR
from data
group by VisitNum, Date, Location, Trainer")
# Define UI for application
ui <- fluidPage(
titlePanel("Exercise Data Analysis"),
dashboardPage(
dashboardHeader(title=""),
dashboardSidebar(
sidebarMenu(
menuItem("All Data",
tabName = "AllData",
icon=icon("table")
),
menuItem("Trainer Boxplots",
tabName = "trainbox",
icon=icon("dumbbell")
),
selectInput(inputId = "trainerselect",label="Select a Trainer:",choices=TrainerChoices)
)
),
dashboardBody(
tabItems(
tabItem(
tabName = "AllData",
DTOutput("alldata")
),
tabItem(
tabName = "trainbox",
plotOutput("trainbox")
))
)
)
)
# Define server logic
server <- function(input, output) {
#----------ALL DATA TABLE----------#
output$alldata=renderDT({
datatable(Table1,options=list(pageLength=10,
lengthMenu=c(10,15,20,25)
),rownames = FALSE)
})
#---------- TRAINER BOXPLOTS ----------#
TrainData=reactive({
NewDummy=ifelse(data$Trainer2==input$TrainerChoices,input$TrainerChoices,"Other")
return(NewDummy)
})
output$trainbox=renderPlot({
plot=ggplot(TrainData(),aes(y=Calories,x=as.factor(NewDummy)))+geom_boxplot(aes(col=as.factor(NewDummy)))
plot
})
}
# Run the application
shinyApp(ui = ui, server = server)
当我 运行 此代码时,“所有数据”选项卡显示得很好,但我无法让 Trainer Boxplots 正确显示。该页面出现错误,内容为:
`data` must be a data frame, or other object coercible by `fortify()`, not a logical vector
有人可以帮我指明正确的方向吗?任何帮助,将不胜感激!谢谢!
我不确定这是否是您想要的,但也许这会有所帮助。
首先,你的selectInput
在ui
的id是trainerselect
,所以你需要通过input$trainerselect
访问,而不是TrainerChoices
。
您的 TrainData
反应式表达式将 return 一个字符值(培训师姓名或 "Other");我假设您想使用 data
作为您的数据源,而不是这个。 NewDummy
是反应式表达式中的局部变量。也许这就是您想要的 TrainData()
.
如果我是 mistaken/confused,请告诉我。
server <- function(input, output) {
#----------ALL DATA TABLE----------#
output$alldata=renderDT({
datatable(Table1,options=list(pageLength=10,
lengthMenu=c(10,15,20,25)
),rownames = FALSE)
})
#---------- TRAINER BOXPLOTS ----------#
TrainData=reactive({
NewDummy=ifelse(data$Trainer2==input$trainerselect,input$trainerselect,"Other")
return(NewDummy)
})
output$trainbox=renderPlot({
NewDummy <- TrainData()
plot=ggplot(data,aes(y=Calories,x=as.factor(NewDummy)))+
geom_boxplot(aes(col=as.factor(NewDummy)))
plot
})
}