【问题标题】:Creating a map function to iterate over an API request创建映射函数以迭代 API 请求
【发布时间】:2021-09-02 19:48:31
【问题描述】:

首先,这是dput的数据:

df <- structure(list(Id = 111323317:111323326, TypeId = c(37L, 
37L, 37L, 37L, 37L, 37L, 37L, 37L, 37L, 37L), PlayerId = c(458228L, 
458228L, 458228L, 458228L, 458228L, 458228L, 458228L, 458228L, 
458228L, 458228L), TeamId = c(1866215L, 1866214L, 1866215L, 
1866215L, 1866215L, 1866215L, 1866214L, 1866215L, 1866215L, 1866215L
)), row.names = c(NA, -10L), class = "data.frame")

接下来我们把数据变成自己的值:

Ids <- df$Id
TypeIds <- df$TypeId
PlayerIds <- df$PlayerId
TeamIds <- df$TeamId

接下来,我们为部分 API 调用创建数据主体,并引用上述值:

data_players = paste0(' { "Context": { "TypeId": "', TypeIds, '" }, "responses": [ { "type": "Players", "PlayerId": "', PlayerIds, '", "TeamId": "', TeamIds, '" } ] } ')

然后我们使用Ids创建一串要调用的URL:

api_urls <- sprintf('https://api.sports.com/players/%s/stats', Ids)

最后,我们有 API 调用本身(这不是实际的 URL,由于显而易见的原因我不能分享):

get_data <- POST(api_urls[1], add_headers(.headers=headers_upsert), body = data_players)

显然,上面的示例将只使用api_urls 字符串的第一个值。我要做的是创建一个map 函数,该函数将使用data_players 和api_urls 中的数据进行迭代。

最有效的方法是什么?

【问题讨论】:

  • 如果我理解您的问题,您正在寻找purrr::map2_ 系列函数。
  • 你能告诉我你的意思吗?喜欢围绕我的数据/问题进行情境化?这就是我最好的学习方式
  • 我在下面做的:)

标签: r purrr httr


【解决方案1】:

我认为您想迭代这两个值,对吗?

为此,您需要使用purrr::map2_ 系列函数,您的代码将类似于...

get_data <- purrr::map2(
    .x = api_urls, 
    .y = data_players, 
     ~POST(.x, add_headers(.headers=headers_upsert), body = .y))

您将使用.y 和.x 来识别您的向量,而purrr 将完成剩下的工作。它会同时遍历你的向量并返回一个包含你操作结果的列表。

如果您不想要列表,而是想要 data.frame,例如,您可以更改 map2_ 风格。有几个选项,例如map2_dbl(用于双精度)、map2_chr(用于字符向量)、map2_dfr(用于数据框行)。

你可以参考函数文档here

【讨论】:

    猜你喜欢
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 2020-01-14
    • 2021-03-03
    • 2016-08-06
    相关资源
    最近更新 更多