R Shiny app sliderInput 控制 GGplot 中的 x 轴

R Shiny app sliderInput control x axis in GGplot

我有 25 辆车参加了 58 圈的比赛。

Static plot showing all 58 laps

我想要一个滑块来控制在图表中看到的圈数作为 ggplot 中的 x 轴。

UI:

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

服务器:

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,但每次只得到一个点。

请帮忙。

如果你真的想用 sliderInput 来做,你可以执行以下操作:

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

  • 创建一个整数序列,最小值和最大值由范围滑块

    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('')

    })

  })