Erro ao usar mutate() + httr::status_code()

Olá pessoal, tudo bem?

Eu estou com uma dificuldade para usar a função httr::status_code() em uma coluna de URLs que tenho em uma base de dados que obtive através de webscrapping. O objetivo é saber se o link direciona para uma página que existe e funciona (aliás, se existir uma função mais adequada por favor me avisem).

Para caber na dúvida, selecionei apenas a coluna que contém os links, e apenas as duas primeiras linhas (é a base df_exemplo abaixo).
Coloquei um exemplo de código onde a função funciona.

Porém estou tentando usar com mutate(), e aí resulta em erros…

Alguém pode me dar uma dica do que eu estou fazendo errado?

Abraços!

library(tidyverse)
library(httr)

df_exemplo <-
  structure(
    list(
      link_ata_url = c(
        "http://www.sigrh.sp.gov.br/public/uploads/records//CBH-MOGI/18977/extrato-da-ata-73-r-o.pdf",
        "http://www.sigrh.sp.gov.br/public/uploads/records//CBH-MOGI/18976/ata-completa-73-r-o.pdf"
      )
    ),
    row.names = c(NA,-2L),
    class = c("tbl_df", "tbl", "data.frame")
  )

# A função funciona assim (sem mutate) ------


httr::status_code(httr::GET(df_exemplo$link_ata_url[[1]])) 
# >  [1] 200


# Não estou conseguindo usar com mutate ----

df_exemplo %>% 
  mutate(link_ata_status = httr::status_code(httr::GET(link_ata_url))) 

# Erro: Problem with `mutate()` input `link_ata_status`.
# x length(url) == 1 is not TRUE
# i Input `link_ata_status` is `httr::status_code(httr::GET(link_ata_url))`.
# Run `rlang::last_error()` to see where the error occurred.

O problema é que a função httr::GET() não é vetorizada. Ou seja, não aceita um vetor de urls, apenas uma única string tem q ser passada. O mutate tá tentando fazer isso: httr::status_code(httr::GET(df_exemplo$link_ata_url))

O pulo do gato é vetorizar o httr::GET() com o purrr::map_dbl():

df_exemplo %>% 
  mutate(link_ata_status = map_dbl(link_ata_url, ~httr::status_code(httr::GET(.x)))) 
1 curtida

Oi Athos, mil obrigadas!!
Funcionou! Eu complementei com a função possibly() pois cada vez que a url era um NA (por exemplo, no site que eu raspei não informava nenhum link para a ata da reunião), o código parava por causa do erro…

df_exemplo %>% 
mutate(link_ata_status = purrr::map_dbl(link_ata_url, possibly(
      ~ httr::status_code(httr::GET(.x)), otherwise = NA
    )))

Novamente, muito obrigada! :partying_face: :partying_face:

1 curtida