我在一场比赛中有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
,但每个只获得一个点。
请帮忙。
答案 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('')
})
})