Skip to contents

Skater box score of a game: scoring, shots, faceoffs, time on ice, hits and blocks.

Usage

vhl_player_box(season, game_id, stage = "regular", return_parsed = TRUE)

Arguments

season

Season END year (2026 = 2025/26; the calendar covers 2010/11 on). With stage it is mapped to the site's tournament id, see vhl_tn().

game_id

Required. Game id (game_id in vhl_schedule; the report's and the broadcast's idgame), e.g. 899223.

stage

Season stage: "regular" (default) or "playoff".

return_parsed

TRUE (default) returns the parsed tibble; FALSE returns the page's parsed record (a named list, the sdv-internal-refs capture shape, plus _request with the season, stage, tn and the ids asked for).

Value

A fastRhockey_data tibble with one row per skater:

col_nametypedescription
game_idintegerGame id (the calendar's game_id; the report's and the broadcast's idgame). The report and broadcast pages do not print it: it comes from the request.
seasonintegerSeason END year (2026 = 2025/26).
stagecharacterSeason stage: regular or playoff.
game_numberintegerOfficial game number (from 'No.984'); checked against the request.
team_sidecharacterSide of the game the row belongs to: home or away.
team_page_idintegerTeam page id (vhlru.ru /en/teams/{team_page_id}/), stable across seasons; for report rows the page id of the row's side.
teamcharacterTeam short name (Latin; the report tables' form).
position_groupcharacterPosition group: defense or forward.
jerseyintegerJersey number (integer).
player_idintegerPlayer id: the {player_id} of /en/players/{player_id}/, stable across seasons and teams; also the photo id on img.khl.ru. Same numeric sequence as khl.ru player ids; whether it equals the same person's khl.ru id is unverified.
playercharacterPlayer name, 'Surname Given' (Latin on /en/ pages).
captaincycharacterCaptaincy marker from the name suffix: C (captain), A (alternate); null otherwise.
games_playedintegerGames played (GP).
goalsintegerGoals (G) the player scored in the row's scope: the game in a box score, the season stage in stats and career rows.
assistsintegerAssists (A) credited to the player in the row's scope: the game in a box score, the season stage in stats and career rows.
pointsintegerPoints, goals + assists (PTS).
plus_minusintegerPlus/minus (+/-).
penalty_minutesintegerPenalty minutes (PIM).
even_strength_goalsintegerEven-strength goals (ESG).
power_play_goalsintegerPower-play goals (PPG).
shorthanded_goalsintegerShorthanded goals (SHG).
overtime_goalsintegerOvertime goals (OTG).
game_winning_goalsintegerGame-winning goals (GWG).
shootout_deciding_goalsintegerShootout-deciding goals (SDS; the legend says 'Shootouts deciding shots').
shots_on_goalintegerShots on goal (SOG).
shot_pctnumericShooting percentage, goals / shots on goal x 100 (%SOG); 0-100 scale; null when the page shows '-'.
faceoffsintegerFaceoffs taken (FO).
faceoffs_wonintegerFaceoffs won (FOW).
faceoff_pctnumericFaceoff win percentage (%FO); 0-100 scale; null when the page shows '-' (no faceoffs taken).
toi_per_gamecharacterTime on ice in this game (TOI/G with GP 1), 'mm:ss'.
shifts_per_gamenumericShifts in this game (Sft/G with GP 1).
hitsintegerBody checks delivered (Hits).
blocked_shotsintegerBlocked shots (BLS).

With return_parsed = FALSE, the page's parsed record (a named list) instead.

Details

Source: GET https://www.vhlru.ru/en/report/{season}/ (server-rendered HTML, keyless; parsed with rvest). Unofficial use of a public source; payloads are not redistributed.

Owner flag (sanctions)

The VHL is run by Russian league operators, and several clubs are owned or sponsored by sanctioned state companies. Fetching on your own machine is fine; a published data release or a hosted mirror of this data needs the owner's sanctions / legal sign-off first.

Errors

  • fastRhockey_no_data: the VHL has nothing for the request (a season without that stage, a game not in the season's calendar, an unknown game, player or team page).

  • fastRhockey_bad_request: a bad season / stage / id, a missing argument, or HTTP 400 / 422.

  • fastRhockey_asset_fetch: the page could not be fetched, or it is not the page asked for (another season, game or player; a missing table or header drift).

Examples

# \donttest{
  try(vhl_player_box(season = 2026, game_id = 899223))
#> ── VHL Player Box Information from vhlru.ru ────────── fastRhockey 1.0.0.9000 ──
#> ℹ Data updated: 2026-10-13 02:00:26 UTC
#> # A tibble: 34 × 33
#>    game_id season stage  game_number team_side team_page_id team  position_group
#>      <int>  <int> <chr>        <int> <chr>            <int> <chr> <chr>         
#>  1  899223   2026 regul…         984 home               390 Toros defense       
#>  2  899223   2026 regul…         984 home               390 Toros defense       
#>  3  899223   2026 regul…         984 home               390 Toros defense       
#>  4  899223   2026 regul…         984 home               390 Toros defense       
#>  5  899223   2026 regul…         984 home               390 Toros defense       
#>  6  899223   2026 regul…         984 home               390 Toros defense       
#>  7  899223   2026 regul…         984 home               390 Toros defense       
#>  8  899223   2026 regul…         984 home               390 Toros forward       
#>  9  899223   2026 regul…         984 home               390 Toros forward       
#> 10  899223   2026 regul…         984 home               390 Toros forward       
#> # ℹ 24 more rows
#> # ℹ 25 more variables: jersey <int>, player_id <int>, player <chr>,
#> #   captaincy <chr>, games_played <int>, goals <int>, assists <int>,
#> #   points <int>, plus_minus <int>, penalty_minutes <int>,
#> #   even_strength_goals <int>, power_play_goals <int>, shorthanded_goals <int>,
#> #   overtime_goals <int>, game_winning_goals <int>,
#> #   shootout_deciding_goals <int>, shots_on_goal <int>, shot_pct <dbl>, …
# }