Создание нескольких URL с использованием modify_url - PullRequest
0 голосов
/ 28 мая 2019

Я создал функцию очистки страницы, которая очищает некоторые данные.Я хочу иметь возможность создавать список URL-адресов, чтобы я мог передавать более 1 аргумента в вызове функции для создания различных URL-адресов.Есть ли способ сделать это, используя httr::modify_url?

Мой код, который создает один URL-адрес, выглядит следующим образом:

library(tidyverse)
#> Registered S3 methods overwritten by 'ggplot2':
#>   method         from 
#>   [.quosures     rlang
#>   c.quosures     rlang
#>   print.quosures rlang
library(httr)

# Arguments for Function
hand = NULL
prp = "P"
month = NULL
year = 2019
pitch_type = "FA"
report_type = "pfx"
lim = 0

url <- httr::modify_url("https://legacy.baseballprospectus.com/pitchfx/leaderboards/index.php",
                        query = list(
                          hand = hand,
                          reportType = report_type,
                          prp = prp,
                          month = month,
                          year = year,
                          pitch = pitch_type,
                          ds = "velo",
                          lim = lim
                        ))

# Single Query Result
url
#> [1] "https://legacy.baseballprospectus.com/pitchfx/leaderboards/index.php?reportType=pfx&prp=P&year=2019&pitch=FA&ds=velo&lim=0"

Мне было интересно, если бы я мог использовать запрос httr::modify_urlсверху и некоторая комбинация purrr::reduce(paste0) для создания URL для дополнительных аргументов:

# Requested Query
pitch_type = c("FA", "SI")
report_type = c("pfx", "outcome")

# URL Generating Function for User inputs
generate_urls <- function(hand = NULL, report_type = c("pfx", "outcome"), prp = "P", month = NULL, year = NULL, pitch_type = c("FA", "SI"), lim = 0) {
# Not sure of what to put in function for modify_url call
}





# Result 
"https://legacy.baseballprospectus.com/pitchfx/leaderboards/index.php?reportType=pfx&prp=P&year=2019&pitch=FA&ds=velo&lim=0"
#> [1] "https://legacy.baseballprospectus.com/pitchfx/leaderboards/index.php?reportType=pfx&prp=P&year=2019&pitch=FA&ds=velo&lim=0"
"https://legacy.baseballprospectus.com/pitchfx/leaderboards/index.php?reportType=pfx&prp=P&year=2019&pitch=SI&ds=velo&lim=0"
#> [1] "https://legacy.baseballprospectus.com/pitchfx/leaderboards/index.php?reportType=pfx&prp=P&year=2019&pitch=SI&ds=velo&lim=0"
"https://legacy.baseballprospectus.com/pitchfx/leaderboards/index.php?reportType=outcome&prp=P&year=2019&pitch=FA&ds=velo&lim=0"
#> [1] "https://legacy.baseballprospectus.com/pitchfx/leaderboards/index.php?reportType=outcome&prp=P&year=2019&pitch=FA&ds=velo&lim=0"
"https://legacy.baseballprospectus.com/pitchfx/leaderboards/index.php?reportType=outcome&prp=P&year=2019&pitch=SI&ds=velo&lim=0"
#> [1] "https://legacy.baseballprospectus.com/pitchfx/leaderboards/index.php?reportType=outcome&prp=P&year=2019&pitch=SI&ds=velo&lim=0"

1 Ответ

1 голос
/ 28 мая 2019

Вот вариант с использованием функции Tidyverse.Во-первых, мы можем определить пространство параметра, по которому мы хотим пройти

params <- list(
  hand = NULL,
  prp = "P",
  year = 2019,
  month = NULL,
  pitch_type = c("FA", "SI"),
  report_type = c("pfx", "outcome"),
  lim = 0
)

Затем мы можем получить все URL с помощью

library(tidyverse) # tidyr for crossing(); purrr for pmap(), map_chr()
library(httr)  
baseurl <- "https://legacy.baseballprospectus.com/pitchfx/leaderboards/index.php"
crossing(!!!params) %>% 
  pmap(list) %>% 
  map_chr( ~modify_url(baseurl, query=.x) )

, crossing() позаботится о получении всехвозможные комбинации параметров.Затем pmap(list) превращает каждую из строк таблицы в их собственный список (это то, что нам нужно передать в query= параметр modify_url. Затем, наконец, мы вызываем функцию генерации URL для каждого набора параметров и возвращаемстрока символов.

...