R/sn_filter.R

Defines functions sn_filter_people

Documented in sn_filter_people

#' Filter search result and keep only people
#'
#' @param search A data frame generated by `sn_search_wiki()`, or a search query. If a data frame is given, language and limits are ignore.
#' @param language Language to be used for the search.
#' @param limit Maximum numbers of responses to be given.
#'
#' @return A data frame with three columns, `id`, `label`, and `description`; all rows refer to a human being.
#' @export
#'
#' @examples
#' \dontrun{
#' sn_search_wiki("Antonio Vivaldi") %>%
#'   sn_filter_people()
#' }
#'
sn_filter_people <- function(search,
                             language = "ro",
                             limit = 10) {
  if (is.data.frame(search) == TRUE) {
    search_result <- search
  } else if (length(search) > 1) {
    usethis::ui_stop("Input must be a single query or a data frame generated by `sn_search_wiki()`")
  } else if (is.character(search) == TRUE) {
    search_result <- streetnamer::sn_search_wiki(
      search = search,
      language = language,
      limit = limit
    )
  }
  person_id <- purrr::map_dfr(
    .x = search_result$id[2],
    .f =
      function(current_id) {
        current_wiki <- streetnamer::sn_tidy_wiki(id = current_id)

        current_value <- current_wiki %>%
          dplyr::filter(property == "P31") %>%
          dplyr::pull(value)

        if (is.null(current_value)) {
          tibble::tibble(id = as.character("NA"))
        } else if (current_value == "Q5") {
          tibble::tibble(id = current_id)
        } else {
          tibble::tibble(id = as.character("NA"))
        }
      }
  ) %>%
    tidyr::drop_na()

  search_result %>%
    dplyr::semi_join(y = person_id, by = "id")
}
giocomai/streetnamer documentation built on Oct. 14, 2023, 6:27 p.m.