【发布时间】:2022-01-24 16:35:55
【问题描述】:
我正在尝试在 shinyapps.io 上呈现一个表格,但它填充了所有 NA。我正在从https://www.vegasinsider.com/college-basketball/odds/las-vegas/ 抓取 NCAA 篮球传播。在本地,该表呈现良好。但是在shinyapps.io 上,所有数字价差都显示为NA。如果所有传播值都是字符,它只会在 shinyapps.io 上正确显示。但是我不能执行任何数学运算。只要 BetMGM、Caesers、FanDuel 列是数字,它们就会显示为 NA。我将提供一些代码和数据来帮助重现问题。为了简洁起见,我将跳过很多数据清理步骤。
@akrun 这里是抓取表格的代码。我这样做,然后使用一些正则表达式将 game_info 拆分为组件。
# Table Scraping Code
url <- read_html("https://www.vegasinsider.com/college-basketball/odds/las-vegas/")
spread_table <- url %>% html_table(fill = TRUE)
spread_table <- spread_table[[8]]
spread_table <- spread_table %>%
rename(game_info = X1,
VegasInsiderOpen = X2,
BetMGM = X3,
Caesers = X4,
Circa = X5,
FanDuel = X6,
DraftKings = X7,
PointsBet = X8,
SuperBook = X9,
VegasInsiderConsensus = X10)
# A tibble: 8 × 15 (spread_table)
date time away_team_name home_team_name BetMGM Caesers FanDuel
<chr> <chr> <chr> <chr> <dbl> <dbl> <dbl>
12/23 7:00 PM George Mason Wisconsin -11.5 -11.5 -11.5
12/23 4:00 PM Liberty Stanford -1.5 -2.0 -2.0
12/23 10:00 PM BYU Vanderbilt 4.0 5.5 5.5
12/24 12:00 AM South Florida Hawaii -4 -3.5 NA
Shiny 应用的极其简化版本:
ui <- fluidPage(
titlePanel("NCAAB Spreads App"),
tableOutput("upcoming_games")
)
server <- function(input, output, session) {
output$upcoming_games <- renderTable({
spread_table
})
}
shinyApp(ui, server)
@akrun
雪城大学、泽维尔大学、鲍尔州立大学、圣母大学、博伊西州立大学、圣玛丽斯是该子集中的热门球队。但是从我从你的代码中得到的数据框中并没有说明这一点。
这是@jpdugo17下面的数据框,所以它不会丢失
structure(list(date = c("12/27", "12/28", "12/28", "12/28",
"12/28",
"12/28"), time = c("6:00 PM", "7:00 PM", "8:00 PM", "8:00 PM",
"9:00 PM", "10:00 PM"), away_team_name = c("Brown",
"Connecticut",
"Ball State", "Notre Dame", "Fresno State", "Yale"),
home_team_name = c("Syracuse",
"Xavier", "Northern Illinois", "Pittsburgh", "Boise State",
"St. Marys (CA)"
), VegasInsiderOpen = c(-10.5, -3, -3, -6, -4, -12.5), BetMGM =
c(-9.5,
NA, NA, NA, NA, NA), Caesers = c(-10, NA, NA, -3.5, -4, -13),
Circa = c(-9.5, NA, NA, NA, NA, NA), FanDuel = c(NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_),
DraftKings = c(-9.5,
-3, -2, -3.5, -3.5, -12.5), PointsBet = c(NA_real_,
NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_), SuperBook =
c(-9.5,
NA, NA, -4, -4, -13), VegasInsiderConsensus = c(-9.5, -3,
-2, -4, -4, -13)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -6L))
【问题讨论】:
-
你能不能把它从
DT改成renderDataTable和dataTableOutput再运行一次 -
您更新的代码是否正确?我将所有列作为
character类为spread_table-sapply(spread_table, class)# game_info VegasInsiderOpen BetMGM Caesers Circa FanDuel DraftKings "character" "character" "character" "character" "character" "character" "character" PointsBet SuperBook VegasInsiderConsensus "character" "character" "character" -
@akrun 我已经尝试过 renderTable、renderDataTable 和 render_gt,但都没有奏效。是的 - 我在每一个它正在抓取点差的体育博彩上调用了 as.numeric()。
-
我从你的代码中得到列值
VegasInsiderConsensus: chr [1:8] "135½u-10-2 -10" "135½u-10-5½ -10" "127½u-10-2 -10" "135½u-10-2½ -10" ...这显然不是数字 -
从提取的
spread_table,你能做到spread_table1 <- spread_table %>% dplyr::select(game_info, BetMGM, Caesers, FanDuel) %>% tidyr::extract(game_info, into = c("date", "time", "away_team_name", "home_team_name"), "^(\\S+)\\s+([^\n]+)[^A-Za-z]+([^\n]+)[^A-Za-z]+(.*)") %>% dplyr::mutate(across(BetMGM:FanDuel, ~ purrr::map_dbl(stringr::str_replace(str_extract(., "-?[^-u]+(?=\\s)"), "(\\d+)½", "(\\1 + 0.5)"), ~ eval(parse(text = .x)))))