R Shiny app slider输入控制GGplot中的x轴

时间:2016-08-07 10:37:38

标签: r ggplot2 slider shiny

我在一场比赛中有25辆赛车需要58圈。

Static plot showing all 58 laps

我想要一个滑块,我想将图表中的圈数控制为ggplot中的x轴。

UI:

sliderInput("lapsView",
              "Choose laps to view:",
              min = 1,
              max = 58,
              value = 10)

SERVER:

library(shiny)

shinyServer(function(input, output) {


  output$distPlot <- renderPlot({

    f1<- read.csv("F1 2011 Turkey - Fuel Corrected Lap Times.csv", header = T)

    str(f1)
    library(ggplot2)

    f1$Driver<-as.factor(f1$Driver)


    p1 <- ggplot(data=f1, 
                  aes(x = Lap, y= Lap.Time, colour = Driver)) + 
      ylim(80,100)+
      geom_line() + geom_point()                    

    # I combined p1 with p2 to save space.

    p2 <- p1  + coord_polar() 
    p2

  })

})

我想将x=Lap更改为x = sliderInput。 我尝试了x = input$lapsView,但每个只获得一个点。

请帮忙。

Result

1 个答案:

答案 0 :(得分:2)

如果您真的想使用sliderInput,可以执行以下操作:

  • value中参数sliderInput的值从10更改为向量c(1, 58)

  • 创建一个由ranged滑块

    给出的最小值和最大值的整数序列

    lapsView <- seq(input$lapsView[1], input$lapsView[2])

  • f1上进行子集化。这是必要的,否则你会得到不同长度的向量,ggplot会抱怨

    f1_new <- f1[which(f1$Lap %in% lapsView), ]

  • 最后在ggplot中使用新数据集

<强> Ui.R

  sliderInput("lapsView",
              "Choose laps to view:",
              min = 1,
              max = 58,
              value = c(1, 58),
              dragRange = TRUE), 

  checkboxGroupInput("driverID", 
                     "Driver", 
                     c("Sebastian Vettel" = 1, "Mark Webber" = 2, 
                       "Fernando Alonso" = 3, "Lewis Hamilton" = 4, 
                       5, 6, 7, 8, 9, 10, 11, 12 ,13 ,14, 15, 16, 17, 18, 19, 20, 21, 22, 23,24,25),
                     selected = FALSE, inline = FALSE, width = NULL)

Server.R

library(shiny)
library(DT)
server <- shinyServer(function(input, output) {

    output$distPlot <- renderPlot({

      f1 <- read.csv("F1 2011 Turkey - Fuel Corrected Lap Times.csv", header = T)

      f1$Driver <- as.factor(f1$Driver)

      lapsView <- seq(input$lapsView[1], input$lapsView[2]) 

      # driverID <- seq(input$driverID[1], input$driverID[2]) 
      driverID <- input$driverID  
      req(driverID) # require that driverID is not NULL - it would break down the code below

      # Subsetting: 
      f1_new <- f1[which(f1$Lap %in% lapsView & f1$Driver %in% driverID),] 
      p1 <- ggplot(data = f1_new, aes(x = Lap, y = Lap.Time, colour = Driver)) + 
        ylim(80, 100)+ geom_line() + geom_point()
      p2 <- p1 + coord_polar() 
      p2

    })

    observe({
      # input$lapsView returns in this case two values - minimum and maximum 
      # (initially 1 and 58)
      # If we used these values we would have only two points - 1 and 58
      # As we want to have all points in between 1 and 58 we create a sequence
      # with the function `seq`.
      # If you wanted to have a sequence in which starting value differs and 
      # maximum is always given by 58 you could do following:

      #  sliderInput:
      # - remove dragRange = TRUE 
      # - change value from c(1,58) to 1
      #  server
      # - lapsView <- seq(input$lapsView[1], 58) 


      # You want to add another condition to subsetting. It looks fine but 
      # you should change 
      # driverID <- seq(input$driverID[1], input$driverID[2])
      # to 
      # driverID <- input$driverID 
      # because input$driverID alrady contains all choices
      # You have to be careful about the case when there is nothing checked.
      # driverID yields in this case NULL
      # It may break down the code so it is good to use the function `req`


      # Here you can observe values of inputs in the console. It is a 
      # good way to see "what's going on" and to debug the code.

      print(" ================================================== ")
      print("Input$driverID")
      print(input$driverID)

      print("---------------")
      print("input$lapsView")
      print(input$lapsView)
      # two values - min and max

      print(" ================================================== ")
      print('')
      print('')
      print('')

    })

  })