Last active
December 22, 2017 20:16
-
-
Save jbryer/5525690 to your computer and use it in GitHub Desktop.
Shiny Example of Gambler's Run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require(shiny) | |
require(shinyIncubator) | |
require(ggplot2) | |
theme_update(panel.background=element_blank(), | |
panel.grid.major=element_blank(), | |
panel.border=element_blank()) | |
tickets <- as.data.frame(rbind( | |
c( '$1', 1, 15), | |
c( '$2', 2, 11), | |
c( '$4', 4, 62), | |
c( '$5', 5, 100), | |
c( '$10', 10, 143), | |
c( '$20', 20, 250), | |
c( '$30', 30, 562), | |
c( '$50', 50, 3482), | |
c( '$100', 100, 6681), | |
c( '$500', 500, 49440), | |
c('$1500', 1500, 375214), | |
c('$2500', 2500, 618000) | |
), stringsAsFactors=FALSE) | |
names(tickets) <- c('Winnings', 'Value', 'Odds') | |
tickets$Value <- as.integer(tickets$Value) | |
tickets$Odds <- as.integer(tickets$Odds) | |
shinyServer(function(input, output) { | |
data <- NULL | |
#totals <- data.frame | |
newrun <- reactive({ | |
if(input$reload.data > 0 | TRUE) { | |
odds <- sample(max(tickets$Odds), input$games, replace=TRUE) | |
vals <- rep(-1, length(odds)) | |
for(i in 1:nrow(tickets)) { | |
#Subtract the cost of the ticket | |
vals[odds %% tickets[i,'Odds'] == 0] <- tickets[i,'Value'] - 1 | |
} | |
df <- data.frame(Odds=odds, Value=vals, x=1:length(vals)) | |
df$y <- cumsum(df$Value) | |
if(is.null(data)) { | |
data <<- df | |
data$run <<- 1 | |
} else { | |
df$run <- max(data$run) + 1 | |
data <<- rbind(data, df) | |
} | |
return(list(history=data, current=df)) | |
} | |
}) | |
output$tickets <- renderTable({ | |
tickets | |
}) | |
output$plot <- renderPlot({ | |
mydata <- newrun()$current | |
history <- newrun()$history | |
range <- c(-max(abs(c(mydata$y, history$y))), | |
max(abs(c(mydata$y, history$y)))) | |
p <- ggplot() + | |
geom_line(data=history, aes(x=x, y=y, group=run), color='black', alpha=.2) + | |
geom_hline(yintercept=0, colour='blue') + | |
geom_line(data=mydata, aes(x=x, y=y)) + | |
geom_point(data=mydata[mydata$Value > 0,], | |
aes(x=x,y=y,color=paste0('$', (Value+1))), | |
size=2, vjust=-1) + | |
scale_color_brewer('Winnning Value', labels=tickets$Winnings, | |
breaks=tickets$Winnings, palette='Dark2') + | |
ylim(range) + | |
ylab('Cumulative Win/Loss in Dollars') + | |
xlab('Game Sequence') | |
print(p) | |
}, height=400) | |
output$results <- renderText({ | |
mydata <- newrun()$current | |
total <- mean(mydata[mydata$x == max(mydata$x),'y']) | |
return(paste0('Average ', ifelse(total < 0, 'losses', 'winnings'), ' after ', | |
nrow(mydata), ' games is $', prettyNum(abs(total), digits=1))) | |
}) | |
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require(shiny) | |
require(shinyIncubator) | |
require(ggplot2) | |
shinyUI(pageWithSidebar( | |
# Application title | |
headerPanel("Lottery Tickets"), | |
sidebarPanel( | |
helpText(paste0('This application will simulate buying a series of lottery ', | |
'tickets. For example, the default starting point of 365 ', | |
'is meant to simulate buying one lottery ticket a day for ', | |
'a year. The "Odds" tab provides the exact odds of winning ', | |
'each ticket. Clicking the "New Run" button will simulate ', | |
'another "year" of buying tickets showing wins along the way ', | |
'and the total winnings or losses at the end. Past runs ', | |
'will be saved and plotted in light grey to show how the ', | |
'current run compares to previous runs.')), | |
sliderInput("games", "Number of tickets:", | |
min=2, max=365*10, value=365), | |
br(), | |
actionButton('reload.data','New Run') #From shinyIncubator package | |
), | |
mainPanel( | |
tabsetPanel( | |
tabPanel("Plot", | |
h3(textOutput("results")), | |
plotOutput("plot") | |
), | |
tabPanel("Odds", | |
tableOutput("tickets") | |
) | |
) | |
) | |
)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment