From c3f618dd5d6454f1888510a767820653437e50f2 Mon Sep 17 00:00:00 2001 From: Conor Anderson Date: Wed, 11 Apr 2018 13:57:51 -0400 Subject: [PATCH] Update catalogue, pad underlength station codes, update readme, improve tests, remove dependency-heavy station_explorer() --- .Rbuildignore | 13 +- DESCRIPTION | 8 +- NAMESPACE | 14 - R/download_data_sql.R | 12 +- R/map_stations.R | 10 + R/qc.R | 4 +- R/quick_audit.R | 2 +- R/senamhiR.R | 8 +- R/station_explorer.R | 93 ------ R/station_search.R | 7 + R/zzz.R | 2 +- README.Rmd | 43 ++- README.md | 371 ++++++++++++------------ data/catalogue.rda | Bin 36664 -> 39496 bytes man/qc.Rd | 4 +- man/station_explorer.Rd | 23 -- tests/testthat/test-download_data_sql.R | 43 +++ tests/testthat/test-map_stations.R | 21 +- tests/testthat/test-qc.R | 3 +- tests/testthat/test-quick_audit.R | 16 +- tests/testthat/test-senamhiR.R | 17 +- tests/testthat/test-station_search.R | 19 +- 22 files changed, 347 insertions(+), 386 deletions(-) delete mode 100644 R/station_explorer.R delete mode 100644 man/station_explorer.Rd create mode 100644 tests/testthat/test-download_data_sql.R diff --git a/.Rbuildignore b/.Rbuildignore index b8e4acc..91d95f4 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -2,10 +2,9 @@ ^\.Rproj\.user$ ^\.travis\.yml$ ^\.gitlab-ci\.yml$ -appveyor.yml -.gitattributes -.gitignore -README.md -README.Rmd -LICENSE.md -install_senamhiR.R +^appveyor\.yml$ +^\.gitattributes$ +^\.gitignore$ +^README\..*$ +^LICENSE\.md$ +^install_senamhiR\.R$ diff --git a/DESCRIPTION b/DESCRIPTION index e74997c..1319bd3 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,26 +1,24 @@ Package: senamhiR Type: Package Title: A Collection of Functions to Obtain Peruvian Climate Data -Version: 0.4.2 +Version: 0.5.0 Date: 2017-10-08 Authors@R: c(person(given = c("Conor", "I."), family = "Anderson", - role = c("aut","cre"), email = "conor.anderson@mail.utoronto.ca"), + role = c("aut","cre"), email = "conor.anderson@utoronto.ca"), person(given = c("William", "A."), family = "Gough", role = "ths", email = "gough@utsc.utoronto.ca")) -Maintainer: Conor I. Anderson +Maintainer: Conor I. Anderson Description: A collection of functions to obtain archived Peruvian climatological or hydrological data form the Peruvian National Meterology and Hydrology Service. Depends: R (>= 3.1.0) Imports: DBI, - DT, dplyr, geosphere, leaflet, magrittr, RMySQL, - shiny, tibble, utils, zoo diff --git a/NAMESPACE b/NAMESPACE index e6158c0..af2d6ba 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -5,16 +5,12 @@ export(map_stations) export(qc) export(quick_audit) export(senamhiR) -export(station_explorer) export(station_search) importFrom(DBI,dbConnect) importFrom(DBI,dbDisconnect) importFrom(DBI,dbGetQuery) importFrom(DBI,dbListTables) importFrom(DBI,dbReadTable) -importFrom(DT,dataTableOutput) -importFrom(DT,datatable) -importFrom(DT,renderDataTable) importFrom(RMySQL,MySQL) importFrom(dplyr,filter) importFrom(dplyr,select) @@ -25,16 +21,6 @@ importFrom(leaflet,awesomeIcons) importFrom(leaflet,leaflet) importFrom(leaflet,setView) importFrom(magrittr,"%>%") -importFrom(shiny,br) -importFrom(shiny,column) -importFrom(shiny,em) -importFrom(shiny,fluidPage) -importFrom(shiny,fluidRow) -importFrom(shiny,runApp) -importFrom(shiny,selectInput) -importFrom(shiny,shinyApp) -importFrom(shiny,shinyUI) -importFrom(shiny,titlePanel) importFrom(stats,sd) importFrom(tibble,add_column) importFrom(tibble,as_tibble) diff --git a/R/download_data_sql.R b/R/download_data_sql.R index 70a5d99..1fc3d02 100644 --- a/R/download_data_sql.R +++ b/R/download_data_sql.R @@ -20,6 +20,13 @@ download_data_sql <- function(station, year) { + if (nchar(station) < 6) { + station <- suppressWarnings(try(sprintf("%06d", as.numeric(station)), silent = TRUE)) + if (inherits(station, "try-error") | !station %in% catalogue$StationID) { + stop("Station ID appears invalid.") + } + } + station_data <- catalogue[catalogue$StationID == station, ] type = station_data$Type config = station_data$Configuration @@ -27,7 +34,10 @@ download_data_sql <- function(station, year) { conn <- dbConnect(MySQL(), user = "anonymous", host = "pcd.conr.ca", dbname = "pcd") sql_table <- paste0("ID_", station) - if (sum(dbListTables(conn) %in% sql_table) != 1) stop("There was an error getting that table.") + if (sum(dbListTables(conn) %in% sql_table) != 1) { + dbDisconnect(conn) + stop("There was an error getting that table.") + } if (missing(year)) { dat <- as_tibble(dbReadTable(conn, sql_table, row.names = NULL)) diff --git a/R/map_stations.R b/R/map_stations.R index f418d3b..df0ca20 100644 --- a/R/map_stations.R +++ b/R/map_stations.R @@ -25,6 +25,16 @@ map_stations <- function(station, zoom) { if (inherits(station, "data.frame")) { station <- station$StationID } + + if (any(nchar(station) < 6)) { + station[nchar(station) < 6] <- suppressWarnings( + try(sprintf("%06d", as.numeric(station[nchar(station) < 6])), + silent = TRUE)) + } + + if (inherits(station, "try-error") || !station %in% catalogue$StationID) { + stop("One or more requested stations invalid.") + } poi <- NULL diff --git a/R/qc.R b/R/qc.R index d7b1c57..0208e4a 100644 --- a/R/qc.R +++ b/R/qc.R @@ -3,9 +3,9 @@ ##' @description A helper function to perform minimal quality control on the data. ##' For now, this script only performs action on the three main temperature variables. ##' -##' @param dat an R object of type data.frame passed form the export_data script +##' @param dat a \code{tbl_df} generated form the \code{senamhiR} package ##' -##' @return an R object of type data.frame. +##' @return a \code{tbl_df} ##' ##' @importFrom dplyr select filter ##' @importFrom tibble add_column diff --git a/R/quick_audit.R b/R/quick_audit.R index 7257291..60d8c70 100644 --- a/R/quick_audit.R +++ b/R/quick_audit.R @@ -27,7 +27,7 @@ quick_audit <- function(station, variables, by = "year", report = "pct", reverse dat <- station } else { if (inherits(station, "character")) { - dat <- read_data(station) + dat <- download_data_sql(station) } else { stop("I can't figure out what data you've given me.") } diff --git a/R/senamhiR.R b/R/senamhiR.R index 23f496e..1788ac3 100644 --- a/R/senamhiR.R +++ b/R/senamhiR.R @@ -21,7 +21,13 @@ senamhiR <- function(station, year) { station <- trimws(unlist(strsplit(station, split = ","))) } - if (!station %in% catalogue$StationID) { + if (any(nchar(station) < 6)) { + station[nchar(station) < 6] <- suppressWarnings( + try(sprintf("%06d", as.numeric(station[nchar(station) < 6])), + silent = TRUE)) + } + + if (inherits(station, "try-error") || !station %in% catalogue$StationID) { stop("One or more requested stations invalid.") } diff --git a/R/station_explorer.R b/R/station_explorer.R deleted file mode 100644 index 80ef52b..0000000 --- a/R/station_explorer.R +++ /dev/null @@ -1,93 +0,0 @@ -##' @title A Shiny interface to Senamhi weather and river stations -##' -##' @description A function to launch a shiny web app to explore Senamhi stations. -##' -##' @param local logical; if set to `TRUE`, we will show only the data that is available locally. -##' -##' @return none -##' -##' @author Conor I. Anderson -##' -##' @importFrom shiny br column em fluidPage fluidRow runApp selectInput shinyApp shinyUI titlePanel -##' @importFrom DT datatable dataTableOutput renderDataTable -##' -##' @export -##' -##' @examples -##' \dontrun{station_explorer()} - -station_explorer <- function(local = FALSE) { - - if (local) { - if (exists("localcatalogue")) { - data <- localcatalogue - } else { - if (file.exists("localCatalogue.rda")) { - load("localCatalogue.rda") - } else { - stop("You asked to show locally-downloaded data, but I couldn't find a local catalogue file in your environment. Please run `generate_local_catalogue()` first.") - } - } - comment(data) <- "This table lists the data that is present in your working directory, provided you have run `generate_local_catalogue()` recently." - } else { - data <- catalogue - } - - app <- shinyApp( - shinyUI( - fluidPage( - titlePanel("Senamhi station catalogue"), - - # Create a new Row in the UI for selectInputs - fluidRow( - column(2, - selectInput("config", - "Configuration:", - c("All", - unique(as.character(data$Configuration)))) - ), - column(2, - selectInput("type", - "Type:", - c("All", - unique(as.character(data$Type)))) - ), - column(2, - selectInput("sta", - "Station Status:", - c("All", - unique(as.character(data$`Station Status`)))) - ), - column(2, - selectInput("reg", - "Region:", - c("All", - unique(as.character(data$Region)))) - ) - ), - # Create a new row for the table. - fluidRow( - dataTableOutput("table")), - fluidRow(br(em(comment(data)))) - ) - ), - server = function(input, output) { - # Filter data based on selections - output$table <- renderDataTable(datatable({ - if (input$config != "All") { - data <- data[data$Configuration == input$config,] - } - if (input$type != "All") { - data <- data[data$Type == input$type,] - } - if (input$sta != "All") { - data <- data[data$`Station Status` == input$sta,] - } - if (input$reg != "All") { - data <- data[data$Region == input$reg,] - } - data - })) - }) - runApp(app) -} diff --git a/R/station_search.R b/R/station_search.R index 5b0d20d..7a7e436 100644 --- a/R/station_search.R +++ b/R/station_search.R @@ -39,6 +39,13 @@ station_search <- function(name = NULL, ignore.case = TRUE, glob = FALSE, region = NULL, baseline = NULL, config = NULL, target = NULL, dist = 0:100, sort = TRUE, ...) { + if (!is.null(target) && length(target) == 1L && nchar(target) < 6) { + target <- suppressWarnings(try(sprintf("%06d", as.numeric(target)), silent = TRUE)) + if (inherits(target, "try-error") || !target %in% catalogue$StationID) { + stop("Target station appears invalid.") + } + } + # If `name` is not NULL, filter by name if (!is.null(name)) { if (glob) name <- glob2rx(name) diff --git a/R/zzz.R b/R/zzz.R index 3c10d0c..7a1341d 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -1,3 +1,3 @@ .onAttach <- function(libname = find.package("senamhiR"), pkgname = "senamhiR") { packageStartupMessage("The information accessed by this package was compiled and maintained by Peru's National Meteorology and Hydrology Service (Senamhi). The use of this data is of your sole responsibility.") -} \ No newline at end of file +} diff --git a/README.Rmd b/README.Rmd index fab8e6d..2c19d01 100644 --- a/README.Rmd +++ b/README.Rmd @@ -8,11 +8,12 @@ output: ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) library(senamhiR) +library(dplyr) ``` [![build status](https://gitlab.com/ConorIA/senamhiR/badges/master/build.svg)](https://gitlab.com/ConorIA/senamhiR/commits/master) [![Build status](https://ci.appveyor.com/api/projects/status/60kbu1b7wkf7akqn?svg=true)](https://ci.appveyor.com/project/ConorIA/senamhir-bxb45) [![codecov](https://codecov.io/gl/ConorIA/senamhiR/branch/master/graph/badge.svg)](https://codecov.io/gl/ConorIA/senamhiR) -The package provides an automated solution for the acquisition of archived Peruvian climate and hydrology data directly within R. The data was compiled from the Senamhi website, and contains all of the data that was available as of March 2017. This data was originally converted from HTML, and is stored in a MySQL database in tibble format. +The package provides an automated solution for the acquisition of archived Peruvian climate and hydrology data directly within R. The data was compiled from the Senamhi website, and contains all of the data that was available as of April 10, 2018. This data was originally converted from HTML, and is stored in a MySQL database in tibble format. It is important to note that the info on the Senamhi website has not undergone quality control, however, this package includes a helper function to perform the most common quality control operations for the temperature variables. More functions will be added in the future. @@ -77,7 +78,7 @@ If I wanted to download data for Requena (station no. 000280) from 1981 to 2010, ```{r} requ <- senamhiR("000280", 1981:2010) ``` -_Note: Since the StationID numbers contain leading zeros, they must be entered as a character (in quotation marks)._ +_Note: Since the StationID numbers contain leading zeros, any station that is less than six characters long will be padded with zeroes. i.e. 280 becomes 000280._ ```{r} requ @@ -85,15 +86,7 @@ requ Make sure to use the assignment operator (`<-`) to save the data into an R object, otherwise the data will just print out to the console, and won't get saved anywhere in the memory. -## Additional functions - -`senamhiR` includes some additional functions to help visualize stations more easily. - -### `station_explorer()` - -Often, irrespective of the number of filters one uses, it is simply easier to just mouse through a table and find the data that one needs. To make this "mousing" just a little easier, I have included a Shiny data table to help with navigating the list of stations. Call the table up by running `station_explorer()` with no arguments. - -This table is also fully compatible with the advanced search function. To use a filtered list of stations with the Shiny table, just pass a search result as an argument to the function. This result can be a call to `station_search()`, or an object containing a saved search result. +## For easier station visualization ### `map_stations()` @@ -113,7 +106,7 @@ There are two functions included to perform some basic quality control. The `quick_audit()` function will return a tibble listing the percentage or number of missing values for a station. For instance, the following command will return the percentage of missing values in our 30-year Requena dataset: ```{r} -quick_audit(requ, c("Tmean", "Tmax", "Tmin")) +quick_audit(requ, c("Tmax", "Tmin")) ``` Use `report = "n"` to show the _number_ of missing values. Use `by = "month"` to show missing data by month instead of year. For instance, the number of days for which Mean Temperature was missing at Tocache in 1980: @@ -128,8 +121,10 @@ quick_audit(toca, "Tmean", by = "month", report = "n") There is an incomplete and experimental function to perform automated quality control on climate data acquired thought this package. For instance: ```{r} -toca <- senamhiR("000463", year = 1980) -quick_audit(toca, "Tmean", by = "month", report = "n") +requ_dirty <- senamhiR("000280") #1960 to 2018 +requ_qc <- qc(requ_dirty) +requ_qc %>% filter(Observations != "") %>% select(Fecha, `Tmax (C)`, `Tmin (C)`, `Tmean (C)`, Observations) + ``` For now, the data has been tested for decimal place-errors with the following logic: @@ -142,16 +137,16 @@ If the number appears to have missed a decimal place (e.g. 324 -> 32.4; 251 -> 2 If the number seems to be the result of some other typographical error (e.g. 221.2), we discard the data point. -##### Case 2: _T~max~_ < _T~min~_ +##### Case 2: _T_max < _T_min -In case 2, we perform the same tests for both _T~max~_ and _T~min~_. If the number is within 1.5 standard deviations of all values 30 days before and after the day in question, we leave the number alone. (Note: this is often the case for _T~min~_ but seldom the case for _T~max~_). If the number does not fall within 1.5 standard deviations, we perform an additional level of testing to check if the number is the result of a premature decimal point (e.g. 3.4 -> 34.0; 3 -> 30.0). In this case, we try to multiply the number by 10. If this new result is within 1.5 standard deviations of all values 30 days before and after the day in question, we keep the result, otherwise, we discard it. +In case 2, we perform the same tests for both _T_max and _T_min. If the number is within 1.5 standard deviations of all values 30 days before and after the day in question, we leave the number alone. (Note: this is often the case for _T_min but seldom the case for _T_max). If the number does not fall within 1.5 standard deviations, we perform an additional level of testing to check if the number is the result of a premature decimal point (e.g. 3.4 -> 34.0; 3 -> 30.0). In this case, we try to multiply the number by 10. If this new result is within 1.5 standard deviations of all values 30 days before and after the day in question, we keep the result, otherwise, we discard it. _I have less confidence in this solution than I do for Case 1._ #### Cases that are currently missed: - - Cases where _T~min~_ is small because of a typo. - - Cases where _T~max~_ is small because of a typo, but not smaller than _T~min~_. + - Cases where _T_min is small because of a typo. + - Cases where _T_max is small because of a typo, but not smaller than _T_min. #### Cases where this function is plain wrong: @@ -159,11 +154,11 @@ _I have less confidence in this solution than I do for Case 1._ #### Variables controlled for: - - _T~max~_ - - _T~min~_ - - _T~mean~_ + - _T_max + - _T_min + - _T_mean -__No other variables are currently tested; hydrological data is not tested. This data should not be considered "high quality", use of the data is your responsibility.__ Note that all values that are modified form their original values will be recorded in a new "Observations" column in the resultant tibble. +__No other variables are currently tested; hydrological data is not tested. This data should not be considered "high quality", use of the data is your responsibility.__ Note that all values that are modified from their original values will be recorded in a new "Observations" column in the resultant tibble. ## Disclaimer @@ -177,7 +172,9 @@ If that seems like a lot of work, just think about how much work it would have b ## Senamhi terms of use -Senamhi's terms of use were originally posted [here](http://www.senamhi.gob.pe/?p=0613), but that link is currently redirecting to the Senamhi home page. However, the text of the terms was identical to the [terms](http://www.peruclima.pe/?p=condiciones) of Senamhi's PeruClima website ([Google translation](https://translate.google.com/translate?hl=en&sl=es&tl=en&u=http%3A%2F%2Fwww.peruclima.pe%2F%3Fp%3Dcondiciones)). The terms allow for the free and public access to information on their website. Likewise, the data may be used in for-profit and non-profit applications. However, Senamhi stipulates that any use of the data must be accompanied by a disclaimer that Senamhi is the proprietor of the information. The following text is recommended (official text in Spanish): +Senamhi's terms of use are _technically_ supposed to be [here](http://senamhi.gob.pe/?p=terminos_condiciones), but that link is currently redirecting to the Senamhi home page. I authored this package when the terms were still available online. At the time of development, the terms allowed for the free and public access to information on their website, in both for-profit and non-profit applications. However, Senamhi stipulated that any use of the data must be accompanied by a disclaimer that Senamhi is the proprietor of the information. The following text was recommended (official text in Spanish): - **Official Spanish:** _Información recopilada y trabajada por el Servicio Nacional de Meteorología e Hidrología del Perú. El uso que se le da a esta información es de mi (nuestra) entera responsabilidad._ - **English translation:** This information was compiled and maintained by Peru's National Meteorology and Hydrology Service (Senamhi). The use of this data is of my (our) sole responsibility. + +A message similar to the English message above is printed to the R console whenever the package is loaded. \ No newline at end of file diff --git a/README.md b/README.md index cf07fb7..51b4c9f 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,15 @@ -# senamhiR: A collection of functions to obtain Peruvian climate data in R +--- +title: "senamhiR: A collection of functions to obtain Peruvian climate data in R" +output: + html_document: + keep_md: yes +--- [![build status](https://gitlab.com/ConorIA/senamhiR/badges/master/build.svg)](https://gitlab.com/ConorIA/senamhiR/commits/master) [![Build status](https://ci.appveyor.com/api/projects/status/60kbu1b7wkf7akqn?svg=true)](https://ci.appveyor.com/project/ConorIA/senamhir-bxb45) [![codecov](https://codecov.io/gl/ConorIA/senamhiR/branch/master/graph/badge.svg)](https://codecov.io/gl/ConorIA/senamhiR) -The package provides an automated solution for the acquisition of archived Peruvian climate and hydrology data directly within R. The data was compiled from the Senamhi website, and contains all of the data that was available as of March 2017. This data was originally converted from HTML, and is stored in a MySQL database in tibble format. +The package provides an automated solution for the acquisition of archived Peruvian climate and hydrology data directly within R. The data was compiled from the Senamhi website, and contains all of the data that was available as of April 10, 2018. This data was originally converted from HTML, and is stored in a MySQL database in tibble format. It is important to note that the info on the Senamhi website has not undergone quality control, however, this package includes a helper function to perform the most common quality control operations for the temperature variables. More functions will be added in the future. @@ -37,22 +42,22 @@ station_search("Santa") ``` ``` -## # A tibble: 42 x 12 -## Station StationID Type Configuration `Data Start` -## -## 1 SANTA MARIA DE NIEVA 000256 CON M 1951 -## 2 SANTA 000433 CON M 1964 -## 3 SANTA RITA 000829 CON M 1977 -## 4 SANTA ELENA 000834 CON M 1963 -## 5 SANTA ISABEL DE SIGUAS 158201 CON M 1964 -## 6 SANTA CRUZ DE HOSPICIO 113248 SUT M 2015 -## 7 SANTA CRUZ 000351 CON M 1963 -## 8 SANTA CATALINA DE PULAN 153200 CON M 1963 -## 9 HACIENDA SANTA INES 000766 CON M 1954 -## 10 SANTAROSA LLIHUA 151505 CON M 1980 -## # ... with 32 more rows, and 7 more variables: `Data End` , `Station -## # Status` , Latitude , Longitude , Region , -## # Province , District +## # A tibble: 42 x 14 +## Station StationID Type Configuration `Data Start` `Data End` +## +## 1 SANTA MARIA DE N… 000256 CON M 1951 2017 +## 2 SANTA 000433 CON M 1964 1986 +## 3 SANTA RITA 000829 CON M 1977 1992 +## 4 SANTA ELENA 000834 CON M 1963 1973 +## 5 SANTA ISABEL DE … 158201 CON M 1964 1982 +## 6 SANTA CRUZ DE HO… 113248 SUT M 2015 2016 +## 7 SANTA CRUZ 000351 CON M 1963 2018 +## 8 SANTA CATALINA D… 153200 CON M 1963 1983 +## 9 HACIENDA SANTA I… 000766 CON M 1954 1955 +## 10 SANTAROSA LLIHUA 151505 CON M 1980 1998 +## # ... with 32 more rows, and 8 more variables: `Period (Yr)` , +## # `Station Status` , Latitude , Longitude , Region , +## # Province , District , Downloaded ``` Note that the `tibble` object (a special sort of `data.frame`) won't print more than the first 10 rows by default. To see all of the results, you can wrap the command in `View()` so that it becomes `View(find_station("Santa"))`. @@ -65,22 +70,22 @@ station_search("San*", glob = TRUE) ``` ``` -## # A tibble: 135 x 12 -## Station StationID Type Configuration `Data Start` -## -## 1 SANTA MARIA DE NIEVA 000256 CON M 1951 -## 2 SAN RAFAEL 152222 CON M 1965 -## 3 SAN LORENZO # 5 000430 CON M 1966 -## 4 SAN JACINTO DE NEPENA 000424 CON M 1956 -## 5 SAN JACINTO 201901 CON H 1947 -## 6 SAN DIEGO 000420 CON M 1960 -## 7 SANTIAGO ANTUNEZ DE MAYOLO 000426 CON M 1998 -## 8 SANTA 000433 CON M 1964 -## 9 SAN PEDRO 211404 CON H 2009 -## 10 SANTA RITA 000829 CON M 1977 -## # ... with 125 more rows, and 7 more variables: `Data End` , `Station -## # Status` , Latitude , Longitude , Region , -## # Province , District +## # A tibble: 135 x 14 +## Station StationID Type Configuration `Data Start` `Data End` +## +## 1 SANTA MARIA DE N… 000256 CON M 1951 2017 +## 2 SAN RAFAEL 152222 CON M 1965 1966 +## 3 SAN LORENZO # 5 000430 CON M 1966 1972 +## 4 SAN JACINTO DE N… 000424 CON M 1956 1968 +## 5 SAN JACINTO 201901 CON H 1947 1990 +## 6 SAN DIEGO 000420 CON M 1960 1960 +## 7 SANTIAGO ANTUNEZ… 000426 CON M 1998 2018 +## 8 SANTA 000433 CON M 1964 1986 +## 9 SAN PEDRO 211404 CON H 2009 2018 +## 10 SANTA RITA 000829 CON M 1977 1992 +## # ... with 125 more rows, and 8 more variables: `Period (Yr)` , +## # `Station Status` , Latitude , Longitude , Region , +## # Province , District , Downloaded ``` You can filter your search results by region, by station type, by a given baseline period, and by proximity to another station or a vector of coordinates. You can use any combination of these four filters in your search. The function is fully documented, so take a look at `?station_search`. Let's see some examples. @@ -92,22 +97,22 @@ station_search(region = "SAN MARTIN") ``` ``` -## # A tibble: 72 x 12 -## Station StationID Type Configuration `Data Start` `Data End` -## -## 1 MOYOBAMBA 000378 CON M 1946 2016 -## 2 NARANJILLO 000219 CON M 1975 2016 -## 3 NAVARRO 000386 CON M 1964 2016 -## 4 NARANJILLO 4724851A SUT M1 2000 2016 -## 5 EL PORVENIR 4723013A SUT M1 2001 2016 -## 6 NUEVO LIMA 153312 CON M 1963 2016 -## 7 SHEPTE 153301 CON M 1963 1985 -## 8 TINGO DE PONAZA 153318 CON M 1963 2005 -## 9 TINGO DE PONAZA 000297 CON M 1998 2016 -## 10 PUEBLO LIBRE 152228 CON M 1996 1998 -## # ... with 62 more rows, and 6 more variables: `Station Status` , -## # Latitude , Longitude , Region , Province , -## # District +## # A tibble: 72 x 14 +## Station StationID Type Configuration `Data Start` `Data End` +## +## 1 MOYOBAMBA 000378 CON M 1946 2017 +## 2 NARANJILLO 000219 CON M 1975 2017 +## 3 NAVARRO 000386 CON M 1964 2017 +## 4 NARANJILLO 4724851A SUT M1 2000 2018 +## 5 EL PORVENIR 4723013A SUT M1 2001 2018 +## 6 NUEVO LIMA 153312 CON M 1963 2017 +## 7 SHEPTE 153301 CON M 1963 1985 +## 8 TINGO DE PONAZA 153318 CON M 1963 2005 +## 9 TINGO DE PONAZA 000297 CON M 1998 2017 +## 10 PUEBLO LIBRE 152228 CON M 1996 1998 +## # ... with 62 more rows, and 8 more variables: `Period (Yr)` , +## # `Station Status` , Latitude , Longitude , Region , +## # Province , District , Downloaded ``` #### Find stations named "Santa", with data available between 1971 to 2000 @@ -116,22 +121,22 @@ station_search("Santa", baseline = 1971:2000) ``` ``` -## # A tibble: 10 x 12 -## Station StationID Type Configuration `Data Start` -## -## 1 SANTA MARIA DE NIEVA 000256 CON M 1951 -## 2 SANTA CRUZ 000351 CON M 1963 -## 3 SANTA EULALIA 155213 CON M 1963 -## 4 SANTA CRUZ 155202 CON M 1963 -## 5 SANTA ROSA 000536 CON M 1967 -## 6 SANTA MARIA DE NANAY 152409 CON M 1963 -## 7 SANTA RITA DE CASTILLA 152401 CON M 1963 -## 8 SANTA CLOTILDE 000177 CON M 1963 -## 9 SANTA CRUZ 152303 CON M 1963 -## 10 SANTA ROSA 000823 CON M 1970 -## # ... with 7 more variables: `Data End` , `Station Status` , +## # A tibble: 10 x 14 +## Station StationID Type Configuration `Data Start` `Data End` +## +## 1 SANTA MARIA DE N… 000256 CON M 1951 2017 +## 2 SANTA CRUZ 000351 CON M 1963 2018 +## 3 SANTA EULALIA 155213 CON M 1963 2018 +## 4 SANTA CRUZ 155202 CON M 1963 2018 +## 5 SANTA ROSA 000536 CON M 1967 2006 +## 6 SANTA MARIA DE N… 152409 CON M 1963 2018 +## 7 SANTA RITA DE CA… 152401 CON M 1963 2018 +## 8 SANTA CLOTILDE 000177 CON M 1963 2014 +## 9 SANTA CRUZ 152303 CON M 1963 2008 +## 10 SANTA ROSA 000823 CON M 1966 2017 +## # ... with 8 more variables: `Period (Yr)` , `Station Status` , ## # Latitude , Longitude , Region , Province , -## # District +## # District , Downloaded ``` #### Find all stations between 0 and 100 km from Station No. 000401 @@ -140,22 +145,22 @@ station_search(target = "000401", dist = 0:100) ``` ``` -## # A tibble: 57 x 13 -## Station StationID Type Configuration `Data Start` `Data End` -## -## 1 TARAPOTO 000401 CON M 1998 2016 -## 2 CUNUMBUQUE 153311 CON M 1963 2016 -## 3 CUMBAZA 221801 CON H 1968 2015 -## 4 LAMAS 000383 CON M 1963 2016 -## 5 SAN ANTONIO 153314 CON M 1963 2016 -## 6 SHANAO 221802 CON H 1965 2015 -## 7 SHANAO 153328 CON M 2002 2016 -## 8 SHANAO 210006 SUT H 2016 2017 -## 9 TABALOSOS 000322 CON M 1963 2016 -## 10 EL PORVENIR 000310 CON M 1964 2016 -## # ... with 47 more rows, and 7 more variables: `Station Status` , -## # Latitude , Longitude , Region , Province , -## # District , Dist +## # A tibble: 57 x 15 +## Station StationID Type Configuration `Data Start` `Data End` +## +## 1 TARAPOTO 000401 CON M 1998 2017 +## 2 CUNUMBUQUE 153311 CON M 1963 2017 +## 3 CUMBAZA 221801 CON H 1968 2017 +## 4 LAMAS 000383 CON M 1963 2017 +## 5 SAN ANTONIO 153314 CON M 1963 2017 +## 6 SHANAO 221802 CON H 1965 2017 +## 7 SHANAO 153328 CON M 2002 2017 +## 8 SHANAO 210006 SUT H 2016 2018 +## 9 TABALOSOS 000322 CON M 1963 2017 +## 10 EL PORVENIR 000310 CON M 1964 2017 +## # ... with 47 more rows, and 9 more variables: `Period (Yr)` , +## # `Station Status` , Latitude , Longitude , Region , +## # Province , District , Downloaded , Dist ``` #### Find all stations that are within 50 km of Machu Picchu @@ -164,31 +169,31 @@ station_search(target = c(-13.163333, -72.545556), dist = 0:50) ``` ``` -## # A tibble: 19 x 13 -## Station StationID Type Configuration `Data Start` `Data End` -## -## 1 MACHU PICCHU 000679 CON M 1964 2016 -## 2 HUYRO 000678 CON M 1964 1981 -## 3 CHILCA 472A9204 SUT H 2015 2016 -## 4 ECHARATE 000716 CON M 1981 1982 -## 5 MARANURA 000676 CON M 1970 1978 -## 6 OLLANTAYTAMBO 47295014 SUT M 2011 2013 -## 7 QUILLABAMBA 4729B3E6 SUT M1 2001 2016 -## 8 QUILLABAMBA 000606 CON M 1964 2016 -## 9 OCOBAMBA 000681 CON M 1964 1983 -## 10 MOLLEPATA 000680 CON M 1963 1978 -## 11 CUNYAC 156224 CON M 2002 2016 -## 12 ECHARATE 156300 CON M 1963 1981 -## 13 PUENTE CUNYAC 230503 CON H 1995 2016 -## 14 ZURITE 000682 CON M 1964 1983 -## 15 CURAHUASI 000677 CON M 1964 2016 -## 16 URUBAMBA 113131 DAV M 2006 2008 -## 17 URUBAMBA 000683 CON M 1963 2016 -## 18 ANTA ANCACHURO 000684 CON M 1964 2016 -## 19 HUACHIBAMBA 156303 CON M 1963 1978 -## # ... with 7 more variables: `Station Status` , Latitude , -## # Longitude , Region , Province , District , -## # Dist +## # A tibble: 19 x 15 +## Station StationID Type Configuration `Data Start` `Data End` +## +## 1 MACHU PICCHU 000679 CON M 1964 2017 +## 2 HUYRO 000678 CON M 1964 1981 +## 3 CHILCA 472A9204 SUT H 2015 2018 +## 4 ECHARATE 000716 CON M 1981 1982 +## 5 MARANURA 000676 CON M 1970 1978 +## 6 OLLANTAYTAMBO 47295014 SUT M 2011 2013 +## 7 QUILLABAMBA 4729B3E6 SUT M1 2001 2018 +## 8 QUILLABAMBA 000606 CON M 1964 2018 +## 9 OCOBAMBA 000681 CON M 1964 1983 +## 10 MOLLEPATA 000680 CON M 1963 1978 +## 11 CUNYAC 156224 CON M 2002 2018 +## 12 ECHARATE 156300 CON M 1963 1981 +## 13 PUENTE CUNYAC 230503 CON H 1995 2018 +## 14 ZURITE 000682 CON M 1964 1983 +## 15 CURAHUASI 000677 CON M 1963 2017 +## 16 URUBAMBA 113131 DAV M 2006 2008 +## 17 URUBAMBA 000683 CON M 1963 2017 +## 18 ANTA ANCACHURO 000684 CON M 1964 2017 +## 19 HUACHIBAMBA 156303 CON M 1963 1978 +## # ... with 9 more variables: `Period (Yr)` , `Station Status` , +## # Latitude , Longitude , Region , Province , +## # District , Downloaded , Dist ``` ### Acquire data: `senamhiR()` @@ -201,7 +206,7 @@ If I wanted to download data for Requena (station no. 000280) from 1981 to 2010, ```r requ <- senamhiR("000280", 1981:2010) ``` -_Note: Since the StationID numbers contain leading zeros, they must be entered as a character (in quotation marks)._ +_Note: Since the StationID numbers contain leading zeros, any station that is less than six characters long will be padded with zeroes. i.e. 280 becomes 000280._ ```r @@ -209,36 +214,28 @@ requ ``` ``` -## # A tibble: 10,957 x 14 -## Fecha `Tmean (C)` `Tmax (C)` `Tmin (C)` `TBS07 (C)` `TBS13 (C)` -## -## 1 1981-01-01 29.0 35.0 23.0 24.8 30.2 -## 2 1981-01-02 28.1 34.0 22.2 24.2 30.0 -## 3 1981-01-03 26.1 29.0 23.2 24.6 25.2 -## 4 1981-01-04 26.1 30.2 22.0 24.6 28.0 -## 5 1981-01-05 27.7 33.0 22.4 24.0 25.0 -## 6 1981-01-06 29.1 35.2 23.0 25.0 30.8 -## 7 1981-01-07 28.3 33.6 23.0 25.4 30.8 -## 8 1981-01-08 30.1 37.4 22.8 25.4 35.0 -## 9 1981-01-09 29.0 35.0 23.0 27.0 35.0 -## 10 1981-01-10 29.0 35.6 22.4 24.8 34.4 -## # ... with 10,947 more rows, and 8 more variables: `TBS19 (C)` , -## # `TBH07 (C)` , `TBH13 (C)` , `TBH19 (C)` , `Prec07 -## # (mm)` , `Prec19 (mm)` , `Direccion del Viento` , -## # `Velocidad del Viento (m/s)` +## # A tibble: 10,957 x 13 +## Fecha `Tmax (C)` `Tmin (C)` `TBS07 (C)` `TBS13 (C)` `TBS19 (C)` +## +## 1 1981-01-01 35.0 23.0 24.8 30.2 24.4 +## 2 1981-01-02 34.0 22.2 24.2 30.0 25.6 +## 3 1981-01-03 29.0 23.2 24.6 25.2 24.0 +## 4 1981-01-04 30.2 22.0 24.6 28.0 25.0 +## 5 1981-01-05 33.0 22.4 24.0 25.0 23.4 +## 6 1981-01-06 35.2 23.0 25.0 30.8 27.8 +## 7 1981-01-07 33.6 23.0 25.4 30.8 26.0 +## 8 1981-01-08 37.4 22.8 25.4 35.0 24.0 +## 9 1981-01-09 35.0 23.0 27.0 35.0 26.0 +## 10 1981-01-10 35.6 22.4 24.8 34.4 28.0 +## # ... with 10,947 more rows, and 7 more variables: `TBH07 (C)` , +## # `TBH13 (C)` , `TBH19 (C)` , `Prec07 (mm)` , `Prec19 +## # (mm)` , `Direccion del Viento` , `Velocidad del Viento +## # (m/s)` ``` Make sure to use the assignment operator (`<-`) to save the data into an R object, otherwise the data will just print out to the console, and won't get saved anywhere in the memory. -## Additional functions - -`senamhiR` includes some additional functions to help visualize stations more easily. - -### `station_explorer()` - -Often, irrespective of the number of filters one uses, it is simply easier to just mouse through a table and find the data that one needs. To make this "mousing" just a little easier, I have included a Shiny data table to help with navigating the list of stations. Call the table up by running `station_explorer()` with no arguments. - -This table is also fully compatible with the advanced search function. To use a filtered list of stations with the Shiny table, just pass a search result as an argument to the function. This result can be a call to `station_search()`, or an object containing a saved search result. +## For easier station visualization ### `map_stations()` @@ -260,23 +257,23 @@ The `quick_audit()` function will return a tibble listing the percentage or numb ```r -quick_audit(requ, c("Tmean", "Tmax", "Tmin")) -``` - -``` -## # A tibble: 30 x 4 -## Year `Tmean (C) pct NA` `Tmax (C) pct NA` `Tmin (C) pct NA` -## -## 1 1981 8.4931507 8.4931507 8.4931507 -## 2 1982 0.0000000 0.0000000 0.0000000 -## 3 1983 41.9178082 41.9178082 41.9178082 -## 4 1984 17.2131148 8.1967213 17.2131148 -## 5 1985 7.6712329 0.2739726 7.6712329 -## 6 1986 0.8219178 0.8219178 0.8219178 -## 7 1987 17.8082192 17.8082192 17.8082192 -## 8 1988 8.4699454 8.4699454 8.4699454 -## 9 1989 0.0000000 0.0000000 0.0000000 -## 10 1990 0.0000000 0.0000000 0.0000000 +quick_audit(requ, c("Tmax", "Tmin")) +``` + +``` +## # A tibble: 30 x 3 +## Year `Tmax (C) pct NA` `Tmin (C) pct NA` +## +## 1 1981 8.49 8.49 +## 2 1982 0. 0. +## 3 1983 41.9 41.9 +## 4 1984 8.20 17.2 +## 5 1985 0.274 7.67 +## 6 1986 0.822 0.822 +## 7 1987 17.8 17.8 +## 8 1988 8.47 8.47 +## 9 1989 0. 0. +## 10 1990 0. 0. ## # ... with 20 more rows ``` @@ -290,20 +287,20 @@ quick_audit(toca, "Tmean", by = "month", report = "n") ``` ## # A tibble: 12 x 5 -## Year Month `Year-month` `Tmean (C) consec NA` `Tmean (C) tot NA` +## Year Month `Year-month` `Tmean (C) consec NA` `Tmean (C) tot NA` ## -## 1 1980 01 Jan 1980 0 0 -## 2 1980 02 Feb 1980 0 0 -## 3 1980 03 Mar 1980 2 3 -## 4 1980 04 Apr 1980 4 4 -## 5 1980 05 May 1980 0 0 -## 6 1980 06 Jun 1980 0 0 -## 7 1980 07 Jul 1980 0 0 -## 8 1980 08 Aug 1980 0 0 -## 9 1980 09 Sep 1980 1 1 -## 10 1980 10 Oct 1980 0 0 -## 11 1980 11 Nov 1980 1 1 -## 12 1980 12 Dec 1980 0 0 +## 1 1980 01 Jan 1980 0 0 +## 2 1980 02 Feb 1980 0 0 +## 3 1980 03 Mar 1980 2 3 +## 4 1980 04 Apr 1980 4 4 +## 5 1980 05 May 1980 0 0 +## 6 1980 06 Jun 1980 0 0 +## 7 1980 07 Jul 1980 0 0 +## 8 1980 08 Aug 1980 0 0 +## 9 1980 09 Sep 1980 1 1 +## 10 1980 10 Oct 1980 0 0 +## 11 1980 11 Nov 1980 1 1 +## 12 1980 12 Dec 1980 0 0 ``` ### `qc()` @@ -312,26 +309,20 @@ There is an incomplete and experimental function to perform automated quality co ```r -toca <- senamhiR("000463", year = 1980) -quick_audit(toca, "Tmean", by = "month", report = "n") +requ_dirty <- senamhiR("000280") #1960 to 2018 +requ_qc <- qc(requ_dirty) +requ_qc %>% filter(Observations != "") %>% select(Fecha, `Tmax (C)`, `Tmin (C)`, `Tmean (C)`, Observations) ``` ``` -## # A tibble: 12 x 5 -## Year Month `Year-month` `Tmean (C) consec NA` `Tmean (C) tot NA` -## -## 1 1980 01 Jan 1980 0 0 -## 2 1980 02 Feb 1980 0 0 -## 3 1980 03 Mar 1980 2 3 -## 4 1980 04 Apr 1980 4 4 -## 5 1980 05 May 1980 0 0 -## 6 1980 06 Jun 1980 0 0 -## 7 1980 07 Jul 1980 0 0 -## 8 1980 08 Aug 1980 0 0 -## 9 1980 09 Sep 1980 1 1 -## 10 1980 10 Oct 1980 0 0 -## 11 1980 11 Nov 1980 1 1 -## 12 1980 12 Dec 1980 0 0 +## # A tibble: 5 x 5 +## Fecha `Tmax (C)` `Tmin (C)` `Tmean (C)` Observations +## +## 1 2013-02-27 34.0 22.2 28.1 "Tmax dps: 3.4 -> 34 (1.4)… +## 2 2013-05-08 31.4 20.8 26.1 Tmax dps: 314 -> 31.4 (0.2… +## 3 2013-07-18 30.8 NA NA Tmin err: 221.2 -> NA +## 4 2013-10-28 33.4 23.2 28.3 Tmin dps: 232 -> 23.2 (1.0… +## 5 2013-12-24 30.0 23.6 26.8 "Tmax dps: 3 -> 30 (0.77) " ``` For now, the data has been tested for decimal place-errors with the following logic: @@ -344,16 +335,16 @@ If the number appears to have missed a decimal place (e.g. 324 -> 32.4; 251 -> 2 If the number seems to be the result of some other typographical error (e.g. 221.2), we discard the data point. -##### Case 2: _T~max~_ < _T~min~_ +##### Case 2: _T_max < _T_min -In case 2, we perform the same tests for both _T~max~_ and _T~min~_. If the number is within 1.5 standard deviations of all values 30 days before and after the day in question, we leave the number alone. (Note: this is often the case for _T~min~_ but seldom the case for _T~max~_). If the number does not fall within 1.5 standard deviations, we perform an additional level of testing to check if the number is the result of a premature decimal point (e.g. 3.4 -> 34.0; 3 -> 30.0). In this case, we try to multiply the number by 10. If this new result is within 1.5 standard deviations of all values 30 days before and after the day in question, we keep the result, otherwise, we discard it. +In case 2, we perform the same tests for both _T_max and _T_min. If the number is within 1.5 standard deviations of all values 30 days before and after the day in question, we leave the number alone. (Note: this is often the case for _T_min but seldom the case for _T_max). If the number does not fall within 1.5 standard deviations, we perform an additional level of testing to check if the number is the result of a premature decimal point (e.g. 3.4 -> 34.0; 3 -> 30.0). In this case, we try to multiply the number by 10. If this new result is within 1.5 standard deviations of all values 30 days before and after the day in question, we keep the result, otherwise, we discard it. _I have less confidence in this solution than I do for Case 1._ #### Cases that are currently missed: - - Cases where _T~min~_ is small because of a typo. - - Cases where _T~max~_ is small because of a typo, but not smaller than _T~min~_. + - Cases where _T_min is small because of a typo. + - Cases where _T_max is small because of a typo, but not smaller than _T_min. #### Cases where this function is plain wrong: @@ -361,11 +352,11 @@ _I have less confidence in this solution than I do for Case 1._ #### Variables controlled for: - - _T~max~_ - - _T~min~_ - - _T~mean~_ + - _T_max + - _T_min + - _T_mean -__No other variables are currently tested; hydrological data is not tested. This data should not be considered "high quality", use of the data is your responsibility.__ Note that all values that are modified form their original values will be recorded in a new "Observations" column in the resultant tibble. +__No other variables are currently tested; hydrological data is not tested. This data should not be considered "high quality", use of the data is your responsibility.__ Note that all values that are modified from their original values will be recorded in a new "Observations" column in the resultant tibble. ## Disclaimer @@ -379,7 +370,9 @@ If that seems like a lot of work, just think about how much work it would have b ## Senamhi terms of use -Senamhi's terms of use were originally posted [here](http://www.senamhi.gob.pe/?p=0613), but that link is currently redirecting to the Senamhi home page. However, the text of the terms was identical to the [terms](http://www.peruclima.pe/?p=condiciones) of Senamhi's PeruClima website ([Google translation](https://translate.google.com/translate?hl=en&sl=es&tl=en&u=http%3A%2F%2Fwww.peruclima.pe%2F%3Fp%3Dcondiciones)). The terms allow for the free and public access to information on their website. Likewise, the data may be used in for-profit and non-profit applications. However, Senamhi stipulates that any use of the data must be accompanied by a disclaimer that Senamhi is the proprietor of the information. The following text is recommended (official text in Spanish): +Senamhi's terms of use are _technically_ supposed to be [here](http://senamhi.gob.pe/?p=terminos_condiciones), but that link is currently redirecting to the Senamhi home page. I authored this package when the terms were still available online. At the time of development, the terms allowed for the free and public access to information on their website, in both for-profit and non-profit applications. However, Senamhi stipulated that any use of the data must be accompanied by a disclaimer that Senamhi is the proprietor of the information. The following text was recommended (official text in Spanish): - **Official Spanish:** _Información recopilada y trabajada por el Servicio Nacional de Meteorología e Hidrología del Perú. El uso que se le da a esta información es de mi (nuestra) entera responsabilidad._ - **English translation:** This information was compiled and maintained by Peru's National Meteorology and Hydrology Service (Senamhi). The use of this data is of my (our) sole responsibility. + +A message similar to the English message above is printed to the R console whenever the package is loaded. diff --git a/data/catalogue.rda b/data/catalogue.rda index 5e903506886ac5053532044ed676e1f54cbda4cc..8b64f163fe6f3e7179199cc8e97ceafc6dc7bc8f 100644 GIT binary patch literal 39496 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

iCe(1=iAj0jkiF7l2{o@k*%1{FeT9oaqA?MU7 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 Yo&v<+3^cQ diff --git a/man/qc.Rd b/man/qc.Rd index 487f6c5..d9d4e2c 100644 --- a/man/qc.Rd +++ b/man/qc.Rd @@ -7,10 +7,10 @@ qc(dat) } \arguments{ -\item{dat}{an R object of type data.frame passed form the export_data script} +\item{dat}{a \code{tbl_df} generated form the \code{senamhiR} package} } \value{ -an R object of type data.frame. +a \code{tbl_df} } \description{ A helper function to perform minimal quality control on the data. diff --git a/man/station_explorer.Rd b/man/station_explorer.Rd deleted file mode 100644 index c70ff58..0000000 --- a/man/station_explorer.Rd +++ /dev/null @@ -1,23 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/station_explorer.R -\name{station_explorer} -\alias{station_explorer} -\title{A Shiny interface to Senamhi weather and river stations} -\usage{ -station_explorer(local = FALSE) -} -\arguments{ -\item{local}{logical; if set to `TRUE`, we will show only the data that is available locally.} -} -\value{ -none -} -\description{ -A function to launch a shiny web app to explore Senamhi stations. -} -\examples{ -\dontrun{station_explorer()} -} -\author{ -Conor I. Anderson -} diff --git a/tests/testthat/test-download_data_sql.R b/tests/testthat/test-download_data_sql.R new file mode 100644 index 0000000..7b3c2d2 --- /dev/null +++ b/tests/testthat/test-download_data_sql.R @@ -0,0 +1,43 @@ +library("testthat") +library("senamhiR") + +context("Test `download_data_sql()`") + +## test senamhiR download (H, CON) +test_that("download_data_sql() can download data", { + out <- download_data_sql("230715") + expect_identical(names(out)[6], "Caudal (m^3/s)") + expect_that(out, is_a("tbl_df")) + expect_output(str(out), "6 variables") +}) + +## test senamhiR download by year (H, SUT) +test_that("download_data_sql() can filter by year", { + out <- senamhiR("472D23BE", 2001:2010) + expect_identical(names(out)[7], "Presion (mb)") + expect_that(out, is_a("tbl_df")) + expect_output(str(out), "3652 obs") + expect_output(str(out), "10 variables") +}) + +## test senamhiR download M, DAV +test_that("download_data_sql() can download DAV stations", { + out <- senamhiR("113129", 2001:2005) + expect_identical(names(out)[5], "Humedad (%)") + expect_that(out, is_a("tbl_df")) + expect_output(str(out), "1826 obs") + expect_output(str(out), "9 variables") +}) + +## test senamhiR can pad with zeroes +test_that("download_data_sql() can pad with zeroes", { + out <- senamhiR(401) + expect_identical(names(out)[11], "Prec19 (mm)") + expect_that(out, is_a("tbl_df")) + expect_output(str(out), "13 variables") +}) + +## should fail when no correct station is given +test_that("download_data_sql() fails when an incorrect station is requested", { + expect_error(download_data_sql("foo"), "Station ID appears invalid.", fixed=TRUE) +}) diff --git a/tests/testthat/test-map_stations.R b/tests/testthat/test-map_stations.R index 4053f0b..a0a8a05 100644 --- a/tests/testthat/test-map_stations.R +++ b/tests/testthat/test-map_stations.R @@ -6,10 +6,27 @@ context("Test `map_stations()`") ## test a map of one station test_that("map_stations() can map a single station", { - map_stations("000401") + map <- map_stations("000401") + expect_that(attr(map$x, "leafletData"), is_a("tbl_df")) + expect_output(str(attr(map$x, "leafletData")), "1 obs") + expect_output(str(attr(map$x, "leafletData")), "14 variables") +}) + +## test a map of one station padded with zeros +test_that("map_stations() can pad a StationID", { + map <- map_stations(401) + expect_that(attr(map$x, "leafletData"), is_a("tbl_df")) + expect_output(str(attr(map$x, "leafletData")), "1 obs") + expect_output(str(attr(map$x, "leafletData")), "14 variables") }) ## test a map of one searched stations test_that("map_stations() can map a station search result", { - map_stations(df) + map <- map_stations(df) + expect_identical(attr(map$x, "leafletData"), df) +}) + +## map_stations should fail if we ask for an invalid station +test_that("map_stations() fails if passed an invalid target", { + expect_error(map_stations("foo"), "One or more requested stations invalid.", fixed=TRUE) }) diff --git a/tests/testthat/test-qc.R b/tests/testthat/test-qc.R index c804854..8336325 100644 --- a/tests/testthat/test-qc.R +++ b/tests/testthat/test-qc.R @@ -10,10 +10,9 @@ test_that("qc can fix errors", { out <- qc(indat) expect_identical(names(out)[15], "Observations") expect_that(out, is_a("tbl_df")) - expect_output(str(out), "20820 obs") expect_output(str(out), "15 variables") expect_equal(out$`Tmin (C)`[19660], 23.2) - expect_identical(out$Observations[19660], "Tmin dps: 232 -> 23.2 (1.04)") + expect_identical(out$Observations[19660], "Tmin dps: 232 -> 23.2 (1.03)") }) ## should fail if not enough context diff --git a/tests/testthat/test-quick_audit.R b/tests/testthat/test-quick_audit.R index 5fc8368..b9146f7 100644 --- a/tests/testthat/test-quick_audit.R +++ b/tests/testthat/test-quick_audit.R @@ -6,20 +6,20 @@ context("Test `quick_audit()`") ## test quick audit by year and return percent missing values test_that("quick_audit() can audit by year", { - df <- quick_audit(indat, variables = c("Tmean", "Tmax", "Tmin"), by = "year") + df <- quick_audit(indat, variables = c("Tmax", "Tmin"), by = "year") expect_that(df, is_a("tbl_df")) expect_output(str(df), "3 obs") - expect_output(str(df), "4 variables") - expect_equal(df$`Tmean (C) pct NA`[1], 83.28767) + expect_output(str(df), "3 variables") + expect_equal(df$`Tmax (C) pct NA`[1], 83.28767) }) ## test quick audit by month and return number of missing values test_that("quick_audit() can audit by month", { - df <- quick_audit(indat, variables = c("Tmean", "Tmax", "Tmin"), by = "month", report = "n") + df <- quick_audit(indat, variables = c("Tmax", "Tmin"), by = "month", report = "n") expect_that(df, is_a("tbl_df")) expect_output(str(df), "36 obs") - expect_output(str(df), "9 variables") - expect_equal(df$`Tmean (C) tot NA`[3], 31) + expect_output(str(df), "7 variables") + expect_equal(df$`Tmax (C) tot NA`[3], 31) }) ## test quick_audit with missing variables and in reverse @@ -27,8 +27,8 @@ test_that("quick_audit() can audit with missing variables", { df <- quick_audit(indat, reverse = TRUE) expect_that(df, is_a("tbl_df")) expect_output(str(df), "3 obs") - expect_output(str(df), "14 variables") - expect_lt(df$`Tmean (C) pct present`[1], 16.71233) + expect_output(str(df), "13 variables") + expect_lt(df$`Tmax (C) pct present`[1], 16.71233) }) ## test quick_audit warns if "year" or "month" not set correctly diff --git a/tests/testthat/test-senamhiR.R b/tests/testthat/test-senamhiR.R index 86bd350..362ac55 100644 --- a/tests/testthat/test-senamhiR.R +++ b/tests/testthat/test-senamhiR.R @@ -6,19 +6,26 @@ context("Test `senamhiR()`") ## test senamhiR download test_that("senamhiR can download data", { out <- senamhiR("000401") - expect_identical(names(out)[12], "Prec19 (mm)") + expect_identical(names(out)[11], "Prec19 (mm)") expect_that(out, is_a("tbl_df")) - expect_output(str(out), "6940 obs") - expect_output(str(out), "14 variables") + expect_output(str(out), "13 variables") }) ## test senamhiR download by year test_that("senamhiR can filter by year", { out <- senamhiR("000401", 1998:2000) - expect_identical(names(out)[12], "Prec19 (mm)") + expect_identical(names(out)[11], "Prec19 (mm)") expect_that(out, is_a("tbl_df")) expect_output(str(out), "1096 obs") - expect_output(str(out), "14 variables") + expect_output(str(out), "13 variables") +}) + +## test senamhiR can pad with zeroes +test_that("senamhiR can pad with zeroes", { + out <- senamhiR(401) + expect_identical(names(out)[11], "Prec19 (mm)") + expect_that(out, is_a("tbl_df")) + expect_output(str(out), "13 variables") }) ## should fail when no correct station is given diff --git a/tests/testthat/test-station_search.R b/tests/testthat/test-station_search.R index ea3dd33..b1fbaf6 100644 --- a/tests/testthat/test-station_search.R +++ b/tests/testthat/test-station_search.R @@ -8,15 +8,15 @@ test_that("station_search() can locate a station by name regex", { df <- station_search("Tara*", glob = TRUE) expect_that(df, is_a("tbl_df")) expect_output(str(df), "4 obs") - expect_output(str(df), "12 variables") + expect_output(str(df), "14 variables") }) ## test finding a station by baseline test_that("station_search() can locate a station by baseline", { df <- station_search(baseline = 1965:2015) expect_that(df, is_a("tbl_df")) - expect_output(str(df), "346 obs") - expect_output(str(df), "12 variables") + expect_output(str(df), "363 obs") + expect_output(str(df), "14 variables") }) ## test finding a station by region @@ -24,15 +24,15 @@ test_that("station_search() can locate a station by region", { df <- station_search(region = "TACNA") expect_that(df, is_a("tbl_df")) expect_output(str(df), "56 obs") - expect_output(str(df), "12 variables") + expect_output(str(df), "14 variables") }) ## test finding a station by distance from target test_that("station_search() can locate a station by distance from target", { - df <- station_search(target = "000410", dist = 0:10) + df <- station_search(target = 410, dist = 0:10) expect_that(df, is_a("tbl_df")) expect_output(str(df), "2 obs") - expect_output(str(df), "13 variables") + expect_output(str(df), "15 variables") }) ## test finding a station by distance from coordinates @@ -40,7 +40,7 @@ test_that("station_search() can locate a station by distance for coordinates", { df <- station_search(target = c(-6.50, -76.47), dist = 0:10) expect_that(df, is_a("tbl_df")) expect_output(str(df), "2 obs") - expect_output(str(df), "13 variables") + expect_output(str(df), "15 variables") }) ## station_search should fail if we spell the region incorrectly @@ -52,3 +52,8 @@ test_that("station_search() fails if passed an incorrect region name", { test_that("station_search() fails if passed an incorrect region name", { expect_error(station_search(config = "Q"), "No data found for that config. Did you pass \"m\" or \"h\"?", fixed=TRUE) }) + +## station_search should fail if we ask for an invalid target +test_that("station_search() fails if passed an invalid target", { + expect_error(station_search(target = "foo"), "Target station appears invalid.", fixed=TRUE) +})