我有 25 辆车参加比赛,跑了 58 圈。
Static plot showing all 58 laps
我想要一个 slider 来控制图表中显示的圈数作为 ggplot 中的 x 轴。
用户界面:
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
来做到这一点您可以执行以下操作:
更改参数值
value
在sliderInput
来自10
到向量c(1, 58)
创建一个整数序列,其最小值和最大值由范围 slider 给出
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)
服务器.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('')
})
})
关于R Shiny app sliderInput 控制 GGplot 中的 x 轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38813269/