Shinyapps.io 将所有数值数据转换为 NA

Shinyapps.io Converting All Numeric Data to NA

我正在尝试在 shinyapps.io 上渲染 table,但它填充了所有 NA。我正在从 https://www.vegasinsider.com/college-basketball/odds/las-vegas/ 中收集 NCAA 篮球比赛的点差。在本地,table 渲染良好。但是在 shinyapps.io 上,所有数字点差都显示为 NA。如果所有传播值都是字符,它只会在 shinyapps.io 上正确显示。但是后来我无法执行任何数学运算。只要 BetMGM、Caesers、FanDuel 列是数字,它们就会显示为 NA。我将提供一些代码和数据来帮助重现问题。为了简洁起见,我将跳过很多数据清理步骤。

@akrun 这里是抓取 table 的代码。我这样做,然后使用一些正则表达式将 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

Syracuse、Xavier、Ball State、Notre Dame、Boise State、St Marys 是该子集中的热门球队。但是没有人告诉我从你的代码中得到的数据框。

这是@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))

似乎抓取后的 spread_table 可能以无法将提取的子字符串转换为 numeric class 的方式进行 post 处理 - 即当我们做as.numeric,如果有任何字符,它可能会转换为NA

在下面的代码中,select 抓取后感兴趣的列,然后 extract 来自 'game_info' 列的子字符串要拆分 into 'date' 、'time'、'away_team_name' 和 'home_team_name' 基于正则表达式模式匹配和捕获 ((...)) 那些符合条件的组。 (^(\S+)) - 从字符串的开头 (^) 捕获第一组作为一个或多个非白色 spaces 字符,后跟一个或多个白色 space (\s+),然后捕获不是换行符的字符 (([^\n]+)),后跟任何非字母的字符 ([^A-Za-z]+),捕获第三组作为一个或多个非换行符的字符然后再次是不是字母的字符并捕获其余字符((.*))。然后循环across把'BetMGM'到'FanDuel',提取出没有u或者-的子串字符,后面跟着一个space((?=\s)),用 + 0.5 替换子字符串分数(因为只有一个分数),遍历字符串并 evalutate 字符串

library(dplyr)
library(tidyr)
library(purrr)
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)))))