-
Notifications
You must be signed in to change notification settings - Fork 2
/
aemet_extremes.R
155 lines (128 loc) · 3.9 KB
/
aemet_extremes.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# valores-climatologicos
# https://opendata.aemet.es/dist/index.html#/
#' Extreme values for a station
#'
#' Get recorded extreme values for a station.
#'
#' @family aemet_api_data
#'
#' @param station Character string with station identifier code(s)
#' (see [aemet_stations()]).
#'
#' @param parameter Character string as temperature (`"T"`),
#' precipitation (`"P"`) or wind (`"V"`) parameter.
#'
#' @inheritParams aemet_last_obs
#'
#' @inheritSection aemet_daily_clim API Key
#'
#' @seealso [aemet_api_key()]
#' @return
#' A [`tibble`][tibble::tibble()] or a \CRANpkg{sf} object. If the function
#' finds an error when parsing it would return the result as a `list()` object.
#'
#' @examplesIf aemet_detect_api_key()
#' library(tibble)
#' obs <- aemet_extremes_clim(c("9434", "3195"))
#' glimpse(obs)
#' @export
aemet_extremes_clim <- function(station = NULL, parameter = "T",
verbose = FALSE, return_sf = FALSE,
extract_metadata = FALSE, progress = TRUE) {
# 1. Validate parameters----
if (is.null(station)) {
stop("Station can't be missing")
}
station <- as.character(station)
if (isTRUE(extract_metadata)) station <- default_station
if (is.null(parameter)) {
stop("Parameter can't be missing")
}
if (!is.character(parameter)) {
stop("Parameter need to be character string")
}
if (!parameter %in% c("T", "P", "V")) {
stop("Parameter should be one of 'T', 'P', 'V'")
}
# 2. Call API----
## Metadata ----
if (extract_metadata) {
apidest <- paste0(
"/api/valores/climatologicos/valoresextremos/parametro/",
parameter, "/estacion/", default_station
)
final_result <- get_metadata_aemet(
apidest = apidest,
verbose = verbose
)
return(final_result)
}
## Normal call ----
# Make calls on loop for progress bar
final_result <- list() # Store results
# Deactive progressbar if verbose
if (verbose) progress <- FALSE
if (!cli::is_dynamic_tty()) progress <- FALSE
# nolint start
# nocov start
if (progress) {
opts <- options()
options(
cli.progress_bar_style = "fillsquares",
cli.progress_show_after = 3,
cli.spinner = "clock"
)
cli::cli_progress_bar(
format = paste0(
"{cli::pb_spin} AEMET API ({cli::pb_current}/{cli::pb_total}) ",
"| {cli::pb_bar} {cli::pb_percent} ",
"| ETA:{cli::pb_eta} [{cli::pb_elapsed}]"
),
total = length(station), clear = FALSE
)
}
# nocov end
# nolint end
for (id in station) {
apidest <- paste0(
"/api/valores/climatologicos",
"/valoresextremos/parametro/", parameter, "/estacion/",
id
)
if (progress) cli::cli_progress_update() # nocov
df <- get_data_aemet(apidest = apidest, verbose = verbose)
final_result <- c(final_result, list(df))
}
# nolint start
# nocov start
if (progress) {
cli::cli_progress_done()
options(
cli.progress_bar_style = opts$cli.progress_bar_style,
cli.progress_show_after = opts$cli.progress_show_after,
cli.spinner = opts$cli.spinner
)
}
# nocov end
# nolint end
bindtry <- try(dplyr::bind_rows(final_result), silent = TRUE)
if (inherits(bindtry, "try-error")) {
message("Can't convert to tibble, return list")
return(final_result)
}
final_result <- dplyr::bind_rows(final_result)
final_result <- dplyr::as_tibble(final_result)
final_result <- dplyr::distinct(final_result)
final_result <- aemet_hlp_guess(final_result, "indicativo", dec_mark = ".")
# Check spatial----
if (return_sf) {
# Coordinates from stations
sf_stations <- aemet_stations(verbose, return_sf = FALSE)
sf_stations <- sf_stations[c("indicativo", "latitud", "longitud")]
final_result <- dplyr::left_join(final_result, sf_stations,
by = "indicativo"
)
final_result <- aemet_hlp_sf(final_result, "latitud", "longitud", verbose)
}
final_result
}