R-->基于虚拟变量的SelectInput创建箱线图

R-->基于虚拟变量的SelectInput创建箱线图,r,shiny,dashboard,reactive,R,Shiny,Dashboard,Reactive,我正在尝试构建一个R闪亮的仪表板,它为我的运动数据显示两个页面。我被困在如何为显示每个培训师消耗的卡路里分布的箱线图仪表板编写代码上。我想要做的是有一个selectInput,允许用户从培训师列表中进行选择,此选择将更新箱线图。但是,选择的变量将是一个虚拟变量,我将选择的培训师箱线图与所有其他培训师并排进行比较 以下是我的数据集示例: VisitNum VisitNumMonth Date ClassLength Calories AvgHR Location Trainer V

我正在尝试构建一个R闪亮的仪表板,它为我的运动数据显示两个页面。我被困在如何为显示每个培训师消耗的卡路里分布的箱线图仪表板编写代码上。我想要做的是有一个selectInput,允许用户从培训师列表中进行选择,此选择将更新箱线图。但是,选择的变量将是一个虚拟变量,我将选择的培训师箱线图与所有其他培训师并排进行比较

以下是我的数据集示例:

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)

有人能帮我指出正确的方向吗?任何帮助都将不胜感激!谢谢大家!

我不确定这是否是您想要的,但这可能会有所帮助

首先,用户界面中的selectInput的id为trainerselect,因此需要通过input$trainerselect而不是TrainerChoices进行访问

TrainData反应式表达式将返回一个字符值—培训师名称或其他名称;我假设您希望使用数据作为数据源,而不是这个。NewDummy是反应式表达式中的局部变量。也许这就是您希望从TrainData获得的信息

如果我错了/糊涂了,请告诉我

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
  })

}
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
  })

}