| library(shiny) |
| library(gt) |
| library(dplyr) |
| library(shinyjs) |
| library(shinyauthr) |
| |
| library(httr) |
| library(bslib) |
|
|
| |
|
|
| download_private_csv <- function(repo_id, filename) { |
| url <- paste0("https://huggingface.co/datasets/", repo_id, "/resolve/main/", filename) |
| response <- GET(url, add_headers(Authorization = paste("Bearer", Sys.getenv("GETCSV")))) |
| |
| if (status_code(response) == 200) { |
| content <- content(response, "text") |
| con <- textConnection(content) |
| |
| |
| data <- read.csv(con, |
| header = TRUE, |
| check.names = FALSE, |
| fileEncoding = "UTF-8", |
| stringsAsFactors = FALSE) |
| close(con) |
| return(data) |
| } else { |
| stop("Failed to download dataset") |
| } |
| } |
|
|
| Beam <- download_private_csv("TimStats/CollegePriv", "Beam.csv") |
|
|
| test <- Beam %>% |
| select(Date,PitchofPA,Pitcher,PitcherId,PitcherThrows,PitcherTeam,Batter,BatterId, |
| BatterSide,BatterTeam,Inning,`Top/Bottom`,Outs,Balls,Strikes,TaggedPitchType, |
| AutoPitchType,PitchCall,TaggedHitType,KorBB,PlayResult,OutsOnPlay,RunsScored, |
| RelSpeed,VertRelAngle,HorzRelAngle,SpinRate,SpinAxis,Tilt,RelHeight,RelSide, |
| Extension,InducedVertBreak,HorzBreak,PlateLocHeight,PlateLocSide,VertApprAngle, |
| HorzApprAngle,ExitSpeed,Angle,Direction,Distance,pfxx,pfxz,x0,z0,vx0,vy0,vz0, |
| ax0,ay0,az0,Level,League,ContactPositionX,ContactPositionY,ContactPositionZ, |
| SpinAxis3dTransverseAngle,SpinAxis3dLongitudinalAngle,SpinAxis3dTilt, |
| SpinAxis3dSpinEfficiency,SpinAxis3dSeamOrientationRotationX, |
| SpinAxis3dSeamOrientationRotationY,SpinAxis3dSeamOrientationRotationZ) |
| test <- test %>% |
| mutate("Hit" = case_when(PlayResult %in% c("Single","Double","Triple","HomeRun") ~ TRUE,TRUE ~ FALSE), |
| "CallStrike" = case_when(PitchCall %in% c("StrikeCalled") ~ TRUE, TRUE ~ FALSE), |
| "Whiff" = case_when(PitchCall %in% c("StrikeSwinging") ~ TRUE, TRUE ~ FALSE), |
| "CSW" = CallStrike + Whiff, |
| "Contact" = case_when(PitchCall %in% c("FoulBall","FouBallNotFieldable","InPlay") ~ TRUE, TRUE ~ FALSE), |
| "GB" = case_when(TaggedHitType %in% c('GroundBall') ~ TRUE, TRUE ~ FALSE), |
| "LD" = case_when(TaggedHitType %in% c('LineDrive') ~ TRUE, TRUE ~ FALSE), |
| "FB" = case_when(TaggedHitType %in% c ("FlyBall") ~ TRUE, TRUE ~ FALSE), |
| "PopU" = case_when(TaggedHitType %in% c ("Popup") ~ TRUE, TRUE ~ FALSE), |
| "Swing" = Whiff + Contact, |
| "BBE" = GB + LD + FB + PopU, |
| "HardHit" = ifelse(ExitSpeed >= 95,TRUE,FALSE), |
| "Ball" = case_when(PitchCall %in% c("BallCalled","BallinDirt") ~ TRUE, TRUE ~ FALSE), |
| "Single" = case_when(PlayResult %in% c("Single") ~ TRUE, TRUE ~ FALSE), |
| "Double" = case_when(PlayResult %in% c("Double") ~ TRUE, TRUE ~ FALSE), |
| "Triple" = case_when(PlayResult %in% c("Triple") ~ TRUE, TRUE ~ FALSE), |
| "HR" = case_when(PlayResult %in% c("HomeRun") ~ TRUE, TRUE ~ FALSE), |
| "Sac" = case_when(PlayResult %in% c("Sacrifice") ~ TRUE, TRUE ~ FALSE), |
| "HBP" = case_when(PitchCall %in% c("HitByPitch") ~ TRUE, TRUE ~ FALSE), |
| "Error" = case_when(PlayResult %in% c("Error") ~ TRUE, TRUE ~ FALSE), |
| "FC"= case_when(PlayResult %in% c("FieldersChoice") ~ TRUE, TRUE ~ FALSE), |
| "Out" = case_when(PlayResult %in% c ("Out") ~ TRUE, TRUE ~ FALSE), |
| "BIP" = Single + Double + Triple + HR + Sac + Error + Out + FC, |
| "Count" = paste0(Balls,"-",Strikes), |
| "Strikeout" = ifelse(KorBB == "Strikeout",TRUE,FALSE), |
| "Walk" = ifelse(KorBB == "Walk",TRUE,FALSE), |
| "Zone" = case_when(between(PlateLocSide,-.825,.825) & between(PlateLocHeight,1.45,3.45) ~ TRUE, TRUE ~ FALSE), |
| "AB" = Strikeout + BIP - Sac, |
| "PA" = Strikeout + BIP + Walk + HBP |
| ) |
|
|
|
|
| gt_theme_tim <- function(gt_object,...) { |
| |
| stopifnot(`'gt_object' must be a 'gt_tbl', have you accidentally passed raw data?` = "gt_tbl" %in% |
| class(gt_object)) |
| |
| table_id <- subset(gt_object[['_options']], parameter == 'table_id')$value[[1]] |
| |
| if (is.na(table_id)) { |
| table_id <- gt::random_id() |
| opt_position <- which("table_id" %in% gt_object[["_options"]][["parameter"]])[[1]] |
| gt_object[["_options"]][["value"]][[opt_position]] <- table_id |
| } |
| |
| gt_object %>% |
| |
| gt::tab_style( |
| locations = gt::cells_body(), |
| style = gt::cell_text(font = "Arial", size = px(14)) |
| ) %>% |
| |
| gt::tab_style( |
| locations = gt::cells_column_labels(), |
| style = gt::cell_text(weight = 'bold', font = "Arial", size = px(14)) |
| ) %>% |
| |
| gt::tab_style( |
| locations = gt::cells_row_groups(), |
| style = list( |
| gt::cell_text(font = "Arial", weight = 650, size = px(14), color = "#FFFDF5"), |
| gt::cell_fill(color = "#000000") |
| ) |
| ) %>% |
| |
| gt::tab_style( |
| locations = gt::cells_footnotes(), |
| style = gt::cell_text(font = "Arial", size = px(12)) |
| ) %>% |
| |
| gt::tab_style( |
| locations = gt::cells_title('title'), |
| style = gt::cell_text(weight = 'bold', font = "Arial", size = px(18)) |
| ) %>% |
| |
| gt::tab_style( |
| locations = gt::cells_title('subtitle'), |
| style = gt::cell_text(font = "Arial", size = px(14)) |
| ) %>% |
| |
| gt::tab_style( |
| locations = gt::cells_source_notes(), |
| style = gt::cell_text(font = "Arial", size = px(12)) |
| ) %>% |
| |
| gt::tab_style( |
| locations = gt::cells_column_spanners(), |
| style = gt::cell_text(font = "Arial", weight = 650, size = px(8)) |
| ) %>% |
| gt::tab_options( |
| data_row.padding = 1, |
| table_body.hlines.color = "transparent", |
| column_labels.border.top.color = 'black', |
| column_labels.border.top.width = px(1), |
| column_labels.border.bottom.style = 'none', |
| |
| row_group.border.top.style = "none", |
| row_group.border.top.color = "black", |
| row_group.border.bottom.width = px(1), |
| row_group.border.bottom.color = "black", |
| row_group.border.bottom.style = 'solid', |
| row_group.padding = px(1.5), |
| heading.align = 'center', |
| heading.border.bottom.style = "none", |
| table_body.border.top.style = "none", |
| table_body.border.bottom.color = "white", |
| table.border.bottom.style = 'none', |
| table.border.top.style = 'none', |
| source_notes.border.lr.style = "none", |
| ... |
| ) %>% |
| gt::opt_row_striping() |
| } |
|
|
| user_base <- tibble::tibble( |
| user = c("TrentR", "user2"), |
| password = c(Sys.getenv("Password"), "pass2"), |
| permissions = c("admin", "standard"), |
| name = c("User One", "User Two") |
| ) |
|
|
| |
| ui <- fluidPage( |
| div(class = "pull-right", shinyauthr::logoutUI(id = "logout")), |
| |
| |
| shinyauthr::loginUI(id = "login"), |
| |
| div( |
| id = "bar", |
| |
| titlePanel("College Pitcher"), |
| |
| |
| sidebarLayout( |
| sidebarPanel( |
| selectInput("player", |
| "Select Player", |
| choices = unique(test$Pitcher)), |
| width = 3 |
| ), |
| |
| mainPanel( |
| tabsetPanel( |
| tabPanel("Splits", |
| gt_output("CountFilter"), |
| gt_output("PitchFilter"), |
| gt_output("PitchSideFilter"), |
| gt_output("InningFilter"), |
| gt_output("SideFilter") |
| ) |
| ), |
| width = 9 |
| ) |
| ) |
| ) %>% shinyjs::hidden() |
| ) |
|
|
| |
| server <- function(input, output) { |
| |
| credentials <- shinyauthr::loginServer( |
| id = "login", |
| data = user_base, |
| user_col = user, |
| pwd_col = password, |
| sodium_hashed = FALSE, |
| log_out = reactive(logout_init()) |
| ) |
| |
| |
| logout_init <- shinyauthr::logoutServer( |
| id = "logout", |
| active = reactive(credentials()$user_auth) |
| ) |
| |
| observe({ |
| req(credentials()$user_auth) |
| shinyjs::show(id = "bar") |
| }) |
| |
| output$CountFilter <- render_gt({ |
| test <- test %>% filter(Pitcher == input$player) %>% group_by(Count) %>% |
| summarise( |
| Pitches = n(), |
| |
| "Whiff%" = mean(Whiff,na.rm = TRUE), |
| "CSW%" = mean(CSW,na.rm = TRUE), |
| "Zone%" = mean(Zone,na.rm = TRUE), |
| "ZCon%" = mean(Contact[Zone == TRUE & Swing == TRUE],na.rm = TRUE), |
| "ZSwing%" = mean(Swing[Zone == TRUE],na.rm = TRUE), |
| "OCon%" = mean(Contact[Zone == FALSE & Swing == TRUE],na.rm = TRUE), |
| "OSwing%" = mean(Swing[Zone == FALSE],na.rm = TRUE), |
| "Avg EV" = mean(ExitSpeed[BBE == TRUE],na.rm = TRUE), |
| "EV90" = quantile(ExitSpeed[BBE == TRUE],.9,na.rm = TRUE), |
| "Max EV" = max(ExitSpeed[BBE == TRUE],na.rm = TRUE), |
| "Max EV" = ifelse(is.infinite(`Max EV`),NA,`Max EV`), |
| "GB%" = mean(GB[BBE == TRUE],na.rm = TRUE), |
| "LD%" = mean(LD[BBE == TRUE],na.rm = TRUE), |
| "FB%" = mean(FB[BBE == TRUE],na.rm = TRUE), |
| "AVG" = round(sum(Hit,na.rm = TRUE) / sum(AB,na.rm = TRUE),digits = 3), |
| "OBP" = round((sum(Hit,na.rm = TRUE) + sum(Walk,na.rm = TRUE) + sum(HBP,na.rm = TRUE))/ |
| sum(PA,na.rm = TRUE),digits = 3), |
| "SLG" = (round(sum(Single,na.rm = TRUE) + sum(Double,na.rm = TRUE) * 2 + |
| sum(Triple,na.rm = TRUE) * 3 + sum(HR,na.rm = TRUE)))/sum(AB,na.rm = TRUE))%>% |
| ungroup()%>% |
| gt() %>% |
| gt_theme_tim() %>% |
| fmt_number(columns = `Avg EV`:`Max EV`,decimals = 1) %>% |
| cols_width(Count:Pitches ~ px(70), |
| everything() ~ px(85)) %>% |
| cols_align(align = "center") %>% |
| fmt_number(columns = AVG:SLG,decimals = 3) %>% |
| fmt_percent(columns = ends_with("%")) %>% |
| sub_missing() %>% |
| |
| opt_interactive( |
| use_compact_mode = TRUE, |
| use_pagination = FALSE |
| ) |
| }) |
| output$PitchFilter <- render_gt({ |
| tes <- test %>% |
| filter(Pitcher == input$player) %>% |
| group_by(AutoPitchType) %>% |
| summarise( |
| Pitches = n(), |
| |
| "Usage%" = n() / nrow(.), |
| "Whiff%" = mean(Whiff, na.rm = TRUE), |
| "CSW%" = mean(CSW, na.rm = TRUE), |
| "Zone%" = mean(Zone, na.rm = TRUE), |
| "ZCon%" = mean(Contact[Zone == TRUE & Swing == TRUE], na.rm = TRUE), |
| "ZSwing%" = mean(Swing[Zone == TRUE], na.rm = TRUE), |
| "OCon%" = mean(Contact[Zone == FALSE & Swing == TRUE], na.rm = TRUE), |
| "OSwing%" = mean(Swing[Zone == FALSE], na.rm = TRUE), |
| "Avg EV" = mean(ExitSpeed[BBE == TRUE], na.rm = TRUE), |
| "EV90" = quantile(ExitSpeed[BBE == TRUE], .9, na.rm = TRUE), |
| "Max EV" = max(ExitSpeed[BBE == TRUE], na.rm = TRUE), |
| "Max EV" = ifelse(is.infinite(`Max EV`), NA, `Max EV`), |
| "GB%" = mean(GB[BBE == TRUE], na.rm = TRUE), |
| "LD%" = mean(LD[BBE == TRUE], na.rm = TRUE), |
| "FB%" = mean(FB[BBE == TRUE], na.rm = TRUE), |
| "AVG" = round(sum(Hit, na.rm = TRUE) / sum(AB, na.rm = TRUE), digits = 3), |
| "OBP" = round((sum(Hit, na.rm = TRUE) + sum(Walk, na.rm = TRUE) + sum(HBP, na.rm = TRUE)) / |
| sum(PA, na.rm = TRUE), digits = 3), |
| "SLG" = (round(sum(Single, na.rm = TRUE) + sum(Double, na.rm = TRUE) * 2 + |
| sum(Triple, na.rm = TRUE) * 3 + sum(HR, na.rm = TRUE))) / sum(AB, na.rm = TRUE) |
| ) %>% |
| ungroup() %>% |
| arrange(desc(Pitches)) %>% |
| gt() %>% |
| gt_theme_tim() %>% |
| fmt_number(columns = `Avg EV`:`Max EV`, decimals = 1) %>% |
| cols_label(AutoPitchType = "Type") %>% |
| cols_width( |
| AutoPitchType ~ px(100), |
| Pitches ~ px(70), |
| everything() ~ px(85) |
| ) %>% |
| cols_align(align = "center") %>% |
| fmt_number(columns = AVG:SLG, decimals = 3) %>% |
| fmt_percent(columns = ends_with("%")) %>% |
| sub_missing() %>% |
| opt_interactive( |
| use_compact_mode = TRUE, |
| use_pagination = FALSE |
| ) |
| }) |
| output$PitchSideFilter <- render_gt({ |
| test <- test %>% |
| filter(Pitcher == input$player) %>% |
| group_by(BatterSide) %>% |
| mutate(total_side = n()) %>% |
| ungroup() %>% |
| group_by(AutoPitchType, BatterSide) %>% |
| summarise( |
| Pitches = n(), |
| |
| "Usage%" = (n() / first(total_side)), |
| "Whiff%" = mean(Whiff, na.rm = TRUE), |
| "CSW%" = mean(CSW, na.rm = TRUE), |
| "Zone%" = mean(Zone, na.rm = TRUE), |
| "ZCon%" = mean(Contact[Zone == TRUE & Swing == TRUE], na.rm = TRUE), |
| "ZSwing%" = mean(Swing[Zone == TRUE], na.rm = TRUE), |
| "OCon%" = mean(Contact[Zone == FALSE & Swing == TRUE], na.rm = TRUE), |
| "OSwing%" = mean(Swing[Zone == FALSE], na.rm = TRUE), |
| "Avg EV" = mean(ExitSpeed[BBE == TRUE], na.rm = TRUE), |
| "EV90" = quantile(ExitSpeed[BBE == TRUE], .9, na.rm = TRUE), |
| "Max EV" = max(ExitSpeed[BBE == TRUE], na.rm = TRUE), |
| "Max EV" = ifelse(is.infinite(`Max EV`), NA, `Max EV`), |
| "GB%" = mean(GB[BBE == TRUE], na.rm = TRUE), |
| "LD%" = mean(LD[BBE == TRUE], na.rm = TRUE), |
| "FB%" = mean(FB[BBE == TRUE], na.rm = TRUE), |
| "AVG" = round(sum(Hit, na.rm = TRUE) / sum(AB, na.rm = TRUE), digits = 3), |
| "OBP" = round((sum(Hit, na.rm = TRUE) + sum(Walk, na.rm = TRUE) + sum(HBP, na.rm = TRUE)) / |
| sum(PA, na.rm = TRUE), digits = 3), |
| "SLG" = (round(sum(Single, na.rm = TRUE) + sum(Double, na.rm = TRUE) * 2 + |
| sum(Triple, na.rm = TRUE) * 3 + sum(HR, na.rm = TRUE))) / sum(AB, na.rm = TRUE) |
| ) %>% |
| ungroup() %>% |
| arrange(desc(BatterSide),desc(Pitches)) %>% |
| gt() %>% |
| gt_theme_tim() %>% |
| fmt_number(columns = `Avg EV`:`Max EV`, decimals = 1) %>% |
| cols_label(AutoPitchType = "Type", BatterSide = "Side") %>% |
| cols_width( |
| AutoPitchType ~ px(100), |
| Pitches ~ px(70), |
| BatterSide ~ px(70), |
| everything() ~ px(85) |
| ) %>% |
| cols_align(align = "center") %>% |
| fmt_number(columns = AVG:SLG, decimals = 3) %>% |
| fmt_percent(columns = ends_with("%")) %>% |
| sub_missing() %>% |
| opt_interactive( |
| use_compact_mode = TRUE, |
| use_pagination = FALSE |
| ) |
| }) |
| output$InningFilter <- render_gt({ |
| test <- test %>% filter(Pitcher == input$player) %>% group_by(Inning) %>% |
| summarise( |
| Pitches = n(), |
| |
| "Whiff%" = mean(Whiff,na.rm = TRUE), |
| "CSW%" = mean(CSW,na.rm = TRUE), |
| "Zone%" = mean(Zone,na.rm = TRUE), |
| "ZCon%" = mean(Contact[Zone == TRUE & Swing == TRUE],na.rm = TRUE), |
| "ZSwing%" = mean(Swing[Zone == TRUE],na.rm = TRUE), |
| "OCon%" = mean(Contact[Zone == FALSE & Swing == TRUE],na.rm = TRUE), |
| "OSwing%" = mean(Swing[Zone == FALSE],na.rm = TRUE), |
| "Avg EV" = mean(ExitSpeed[BBE == TRUE],na.rm = TRUE), |
| "EV90" = quantile(ExitSpeed[BBE == TRUE],.9,na.rm = TRUE), |
| "Max EV" = max(ExitSpeed[BBE == TRUE],na.rm = TRUE), |
| "Max EV" = ifelse(is.infinite(`Max EV`),NA,`Max EV`), |
| "GB%" = mean(GB[BBE == TRUE],na.rm = TRUE), |
| "LD%" = mean(LD[BBE == TRUE],na.rm = TRUE), |
| "FB%" = mean(FB[BBE == TRUE],na.rm = TRUE), |
| "AVG" = round(sum(Hit,na.rm = TRUE) / sum(AB,na.rm = TRUE),digits = 3), |
| "OBP" = round((sum(Hit,na.rm = TRUE) + sum(Walk,na.rm = TRUE) + sum(HBP,na.rm = TRUE))/ |
| sum(PA,na.rm = TRUE),digits = 3), |
| "SLG" = (round(sum(Single,na.rm = TRUE) + sum(Double,na.rm = TRUE) * 2 + |
| sum(Triple,na.rm = TRUE) * 3 + sum(HR,na.rm = TRUE)))/sum(AB,na.rm = TRUE))%>% |
| ungroup()%>% |
| gt() %>% |
| gt_theme_tim() %>% |
| fmt_number(columns = `Avg EV`:`Max EV`,decimals = 1) %>% |
| cols_width(Inning:Pitches ~ px(70), |
| everything() ~ px(85)) %>% |
| cols_align(align = "center") %>% |
| fmt_number(columns = AVG:SLG,decimals = 3) %>% |
| fmt_percent(columns = ends_with("%")) %>% |
| sub_missing() %>% |
| |
| opt_interactive( |
| use_compact_mode = TRUE, |
| use_pagination = FALSE |
| ) |
| }) |
| output$SideFilter <- render_gt({ |
| test1 <- test %>% filter(Pitcher == input$player) %>% group_by(BatterSide) %>% |
| summarise( |
| Pitches = n(), |
| |
| "Whiff%" = mean(Whiff,na.rm = TRUE), |
| "CSW%" = mean(CSW,na.rm = TRUE), |
| "Zone%" = mean(Zone,na.rm = TRUE), |
| "ZCon%" = mean(Contact[Zone == TRUE & Swing == TRUE],na.rm = TRUE), |
| "ZSwing%" = mean(Swing[Zone == TRUE],na.rm = TRUE), |
| "OCon%" = mean(Contact[Zone == FALSE & Swing == TRUE],na.rm = TRUE), |
| "OSwing%" = mean(Swing[Zone == FALSE],na.rm = TRUE), |
| "Avg EV" = mean(ExitSpeed[BBE == TRUE],na.rm = TRUE), |
| "EV90" = quantile(ExitSpeed[BBE == TRUE],.9,na.rm = TRUE), |
| "Max EV" = max(ExitSpeed[BBE == TRUE],na.rm = TRUE), |
| "Max EV" = ifelse(is.infinite(`Max EV`),NA,`Max EV`), |
| "GB%" = mean(GB[BBE == TRUE],na.rm = TRUE), |
| "LD%" = mean(LD[BBE == TRUE],na.rm = TRUE), |
| "FB%" = mean(FB[BBE == TRUE],na.rm = TRUE), |
| "AVG" = round(sum(Hit,na.rm = TRUE) / sum(AB,na.rm = TRUE),digits = 3), |
| "OBP" = round((sum(Hit,na.rm = TRUE) + sum(Walk,na.rm = TRUE) + sum(HBP,na.rm = TRUE))/ |
| sum(PA,na.rm = TRUE),digits = 3), |
| "SLG" = (round(sum(Single,na.rm = TRUE) + sum(Double,na.rm = TRUE) * 2 + |
| sum(Triple,na.rm = TRUE) * 3 + sum(HR,na.rm = TRUE)))/sum(AB,na.rm = TRUE))%>% |
| ungroup() |
| test2 <- test %>% mutate(BatterSide = "Both") %>%filter(Pitcher == "Beam, Drew") %>% group_by(BatterSide) %>% |
| summarise( |
| Pitches = n(), |
| |
| "Whiff%" = mean(Whiff,na.rm = TRUE), |
| "CSW%" = mean(CSW,na.rm = TRUE), |
| "Zone%" = mean(Zone,na.rm = TRUE), |
| "ZCon%" = mean(Contact[Zone == TRUE & Swing == TRUE],na.rm = TRUE), |
| "ZSwing%" = mean(Swing[Zone == TRUE],na.rm = TRUE), |
| "OCon%" = mean(Contact[Zone == FALSE & Swing == TRUE],na.rm = TRUE), |
| "OSwing%" = mean(Swing[Zone == FALSE],na.rm = TRUE), |
| "Avg EV" = mean(ExitSpeed[BBE == TRUE],na.rm = TRUE), |
| "EV90" = quantile(ExitSpeed[BBE == TRUE],.9,na.rm = TRUE), |
| "Max EV" = max(ExitSpeed[BBE == TRUE],na.rm = TRUE), |
| "Max EV" = ifelse(is.infinite(`Max EV`),NA,`Max EV`), |
| "GB%" = mean(GB[BBE == TRUE],na.rm = TRUE), |
| "LD%" = mean(LD[BBE == TRUE],na.rm = TRUE), |
| "FB%" = mean(FB[BBE == TRUE],na.rm = TRUE), |
| "AVG" = round(sum(Hit,na.rm = TRUE) / sum(AB,na.rm = TRUE),digits = 3), |
| "OBP" = round((sum(Hit,na.rm = TRUE) + sum(Walk,na.rm = TRUE) + sum(HBP,na.rm = TRUE))/ |
| sum(PA,na.rm = TRUE),digits = 3), |
| "SLG" = (round(sum(Single,na.rm = TRUE) + sum(Double,na.rm = TRUE) * 2 + |
| sum(Triple,na.rm = TRUE) * 3 + sum(HR,na.rm = TRUE)))/sum(AB,na.rm = TRUE))%>% |
| ungroup() |
| test <- rbind(test1,test2) |
| test %>% |
| gt() %>% |
| gt_theme_tim() %>% |
| fmt_number(columns = `Avg EV`:`Max EV`,decimals = 1) %>% |
| cols_width(BatterSide:Pitches ~ px(70), |
| everything() ~ px(85)) %>% |
| cols_align(align = "center") %>% |
| cols_label(BatterSide = "Side") %>% |
| fmt_number(columns = AVG:SLG,decimals = 3) %>% |
| fmt_percent(columns = ends_with("%")) %>% |
| sub_missing() %>% |
| |
| opt_interactive( |
| use_compact_mode = TRUE, |
| use_pagination = FALSE |
| ) |
| |
| }) |
| output$slashline <- render_gt({ |
| test <- test %>% filter(Pitcher == input$player) %>% |
| summarise( |
| Pitches = n(), |
| `1B` = sum(Single,na.rm = TRUE), |
| `2B` = sum(Double,na.rm = TRUE), |
| `3B` = sum(Triple,na.rm = TRUE), |
| HR = sum(HR,na.rm = TRUE), |
| SO = sum(Strikeout,na.rm = TRUE), |
| BB = sum(Walk,na.rm = TRUE), |
| Whiffs = sum(Whiff,na.rm = TRUE), |
| `Hard Hits` = sum(HardHit,na.rm = TRUE) |
| )%>% |
| ungroup()%>% |
| gt() %>% |
| gt_theme_tim() %>% |
| cols_align(align = "center") %>% |
| # gt_theme_savant() %>% |
| opt_interactive( |
| use_compact_mode = TRUE, |
| use_pagination = FALSE |
| ) |
| }) |
| } |
|
|
| # Run the application |
| shinyApp(ui = ui, server = server) |
|
|