无法将列表作为参数传递给函数?我怎样才能在不出错的情况下通过列表?

问题描述 投票:0回答:2

我有以下功能

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(...)
r purrr httr jsonlite
2个回答
1
投票

您的函数似乎只能接受一个标量 eventid 作为其参数,但您正试图传递一个 eventid 向量。 此外,您应该为每次调用

my_func
提供没有默认值的参数。这些是
sport
eventId

你可能想像这样遍历 eventids 向量:

map(eventids, ~my_func(sport = "basketball", eventId = .x))

0
投票

使用以下语法后

eventids <- nba_h2h %>% 
    distinct(id) %>% 
    pull()

并将类 tibble 转换为类“字符”我能够执行以下操作

map(event_ids, ~my_func(sport = "basketball_nba", eventId = .x)) 
%>% bind_rows()

感谢您的帮助和指导!

© www.soinside.com 2019 - 2024. All rights reserved.