我有以下功能
my_func <- function(sport,
eventId = eventids,
apiKey = "xxxxxxxxxxxxxxxxxxxxxxxxxx",
regions = "us",
markets = "alternate_spreads",
odds_format = "american",
date_format = "iso"){
base_url = glue::glue("https://xxx.xxx-xxx-
xxx.xxx/xx/xxxxxx/{sport}/xxxxxx/{eventId}/odds")
query_params <- list(apiKey = apiKey,
sport = sport,
eventId = eventId,
regions = regions,
markets = markets,
oddsFormat = odds_format,
dateFormat = date_format)
endpoint <- httr::modify_url(base_url, query = query_params)
resp <- fromJSON(endpoint) %>%
as_tibble(validate = F) %>%
unnest(cols = bookmakers) %>%
rename("bookmaker_key" = "key") %>%
unnest(cols = markets) %>%
unnest(cols = outcomes)
return(resp)
}
我正在尝试将以下 eventids 列表作为参数传递
eventids <- followinglist
A tibble: 2 × 1
id
<chr>
1 xxxxxxxxxxxxxxxxadaf06d2660af34
2 xxxxxxxxxxxxxxxa67aa5a4bce731a0
当我执行以下语法时
my_func('basketball')
我收到以下错误:
Error in open.connection(con, "rb") :
cannot open the connection to 'https://xxx.xxx-xxxx-xx/sports/basketball/events/truncated?
In addition: Warning message:
In open.connection(con, "rb") :
cannot open URL 'https://xxx.xxx-xxxx-xx/sports/basketball/events/truncated?
HTTP status was '422 Unknown Error'
我也尝试过使用以下格式的 eventids
eventids <- c("xxxxxxxxxxxxxx57adaf06d2660af34", "xxxxxxxxxxx7aa5a4bce731a0")
运行函数时出现如下错误
Error in parse_url(url) : length(url) == 1 is not TRUE
我发现另一篇帖子建议使用
eventids1 = paste(eventids, collapse = ",")
但是,我得到了和上面一样的错误
Error in open.connection(con, "rb") :
cannot open the connection to 'https://xxx.xxx-xxxx - this has been truncated
我也尝试过使用以下
map(eventids, my_func)
但是得到以下错误
Error in `map()`:
ℹ In index: 1.
Caused by error in `parse_url()`:
! length(url) == 1 is not TRUE
Run `rlang::last_error()` to see where the error occurred.
我知道这个函数是有效的,因为如果我传递一个 eventid,我会得到一个响应和数据
my_func('basketball', 'xxxxxxxxxxxxxxxx4bce731a0')
API 一次只允许传递一个 eventid,这就是我想要传递 eventid 列表的原因。如何通过传递列表并将响应写入 tibble 来查询 API?提前谢谢你。
我尝试运行以下
map(eventids, ~my_func(sport = "basketball", eventId = .x))
但出现以下错误。
Error in `map()`:
ℹ In index: 1.
ℹ With name: id.
Caused by error in `parse_url()`:
! length(url) == 1 is not TRUE
Run `rlang::last_error()` to see where the error occurred.
> rlang::last_error()
<error/purrr_error_indexed>
Error in `map()`:
ℹ In index: 1.
ℹ With name: id.
Caused by error in `parse_url()`:
! length(url) == 1 is not TRUE
---
Backtrace:
1. purrr::map(eventids, ~my_func(sport = "basketball_nba", eventId =
.x))
2. purrr:::map_("list", .x, .f, ..., .progress = .progress)
6. global .f(.x[[i]], ...)
7. global my_func(sport = "basketball_nba", eventId = .x)
8. httr::modify_url(base_url, query = query_params)
9. httr::parse_url(url)
10. base::stopifnot(length(url) == 1)
11. base::stop(simpleError(msg, call = if (p <- sys.parent(1L))
sys.call(p)))
Run `rlang::last_trace()` to see the full context.
> rlang::last_trace()
<error/purrr_error_indexed>
Error in `map()`:
ℹ In index: 1.
ℹ With name: id.
Caused by error in `parse_url()`:
! length(url) == 1 is not TRUE
---
Backtrace:
▆
1. ├─purrr::map(eventids, ~my_func(sport = "basketball_nba", eventId =
.x))
2. │ └─purrr:::map_("list", .x, .f, ..., .progress = .progress)
3. │ ├─purrr:::with_indexed_errors(...)
4. │ │ └─base::withCallingHandlers(...)
5. │ ├─purrr:::call_with_cleanup(...)
6. │ └─global .f(.x[[i]], ...)
7. │ └─global my_func(sport = "basketball_nba", eventId = .x)
8. │ └─httr::modify_url(base_url, query = query_params)
9. │ └─httr::parse_url(url)
10. │ └─base::stopifnot(length(url) == 1)
11. │ └─base::stop(simpleError(msg, call = if (p <-
sys.parent(1L)) sys.call(p)))
12. └─purrr (local) `<fn>`(`<smplErrr>`)
13. └─cli::cli_abort(...)
14. └─rlang::abort(...)
您的函数似乎只能接受一个标量 eventid 作为其参数,但您正试图传递一个 eventid 向量。 此外,您应该为每次调用
my_func
提供没有默认值的参数。这些是sport
和eventId
。
你可能想像这样遍历 eventids 向量:
map(eventids, ~my_func(sport = "basketball", eventId = .x))
使用以下语法后
eventids <- nba_h2h %>%
distinct(id) %>%
pull()
并将类 tibble 转换为类“字符”我能够执行以下操作
map(event_ids, ~my_func(sport = "basketball_nba", eventId = .x))
%>% bind_rows()
感谢您的帮助和指导!