diff --git a/.lintr b/.lintr index ae9fe3f..e6d7545 100644 --- a/.lintr +++ b/.lintr @@ -1,4 +1,4 @@ -exclusions: list('inst/doc/osem-intro.R') +exclusions: list.files(path = 'inst/doc', full.names = T) linters: with_defaults( # we use snake case camel_case_linter = NULL, diff --git a/R/archive.R b/R/archive.R index 8bfd17b..71a55b8 100644 --- a/R/archive.R +++ b/R/archive.R @@ -9,18 +9,18 @@ osem_archive_endpoint = function () { } #' Fetch day-wise measurements for a single box from the openSenseMap archive. -#' +#' #' This function is significantly faster than \code{\link{osem_measurements}} for large #' time-frames, as daily CSV dumps for each sensor from #' \href{http://archive.opensensemap.org}{archive.opensensemap.org} are used. #' Note that the latest data available is from the previous day. -#' +#' #' By default, data for all sensors of a box is fetched, but you can select a #' subset with a \code{\link[dplyr]{dplyr}}-style NSE filter expression. -#' +#' #' The function will warn when no data is available in the selected period, #' but continue the remaining download. -#' +#' #' @param x A `sensebox data.frame` of a single box, as retrieved via \code{\link{osem_box}}, #' to download measurements for. #' @param fromDate Start date for measurement download. @@ -28,11 +28,11 @@ osem_archive_endpoint = function () { #' @param sensorFilter A NSE formula matching to \code{x$sensors}, selecting a subset of sensors. #' @param progress Whether to print download progress information, defaults to \code{TRUE}. #' @return A \code{tbl_df} Containing observations of all selected sensors for each time stamp. -#' +#' #' @seealso \href{https://archive.opensensemap.org}{openSenseMap archive} #' @seealso \code{\link{osem_measurements}} #' @seealso \code{\link{osem_box}} -#' +#' #' @export osem_measurements_archive = function (x, ...) UseMethod('osem_measurements_archive') @@ -47,11 +47,11 @@ osem_measurements_archive.default = function (x, ...) { #' @describeIn osem_measurements_archive Get daywise measurements for one or #' more sensors of a single box #' @export -#' @examples +#' @examples #' # fetch measurements for a single day #' box = osem_box('593bcd656ccf3b0011791f5a') #' m = osem_measurements_archive(box, as.POSIXlt('2018-09-13')) -#' +#' #' \donttest{ #' # fetch measurements for a date range and selected sensors #' sensors = ~ phenomenon %in% c('Temperatur', 'Beleuchtungsstärke') @@ -60,11 +60,11 @@ osem_measurements_archive.default = function (x, ...) { osem_measurements_archive.sensebox = function (x, fromDate, toDate = fromDate, sensorFilter = ~ T, progress = T) { if (nrow(x) != 1) stop('this function only works for exactly one senseBox!') - + # filter sensors using NSE, for example: `~ phenomenon == 'Temperatur'` sensors = x$sensors[[1]] %>% dplyr::filter(lazyeval::f_eval(sensorFilter, .)) - + # fetch each sensor separately dfs = by(sensors, 1:nrow(sensors), function (sensor) { df = archive_fetch_measurements(x, sensor$id, fromDate, toDate, progress) %>% @@ -72,7 +72,7 @@ osem_measurements_archive.sensebox = function (x, fromDate, toDate = fromDate, s #dplyr::mutate(unit = sensor$unit, sensor = sensor$sensor) %>% # inject sensor metadata dplyr::rename_at(., 'value', function(v) sensor$phenomenon) }) - + # merge all data.frames by timestamp dfs %>% purrr::reduce(dplyr::full_join, 'createdAt') } @@ -85,25 +85,25 @@ archive_fetch_measurements = function (box, sensor, fromDate, toDate, progress) dates = append(dates, list(from)) from = from + as.difftime(1, units = 'days') } - - http_handle = httr::handle(osem_archive_endpoint()) # reuse the http connection for speed! + + http_handle = httr::handle(osem_archive_endpoint()) # reuse the http connection for speed! progress = if (progress && !is_non_interactive()) httr::progress() else NULL - + measurements = lapply(dates, function(date) { url = build_archive_url(date, box, sensor) res = httr::GET(url, progress, handle = http_handle) - + if (httr::http_error(res)) { warning(paste( httr::status_code(res), 'on day', format.Date(date, '%F'), 'for sensor', sensor )) - + if (httr::status_code(res) == 404) return(data.frame(createdAt = character(), value = character())) } - + measurements = httr::content(res, type = 'text', encoding = 'UTF-8') %>% parse_measurement_csv }) @@ -117,7 +117,7 @@ build_archive_url = function (date, box, sensor) { sensorId = sensor d = format.Date(date, '%F') format = 'csv' - + paste( osem_archive_endpoint(), d, @@ -131,5 +131,5 @@ build_archive_url = function (date, box, sensor) { #' https://github.com/sensebox/osem-archiver/blob/612e14b/helpers.sh#L66 osem_box_to_archivename = function (box) { name = gsub('[^A-Za-z0-9._-]', '_', box$name) - paste(box$X_id, name, sep='-') + paste(box$X_id, name, sep = '-') } diff --git a/R/external_generics.R b/R/external_generics.R index 54b233b..063060f 100644 --- a/R/external_generics.R +++ b/R/external_generics.R @@ -96,17 +96,17 @@ register_s3_method <- function(pkg, generic, class, fun = NULL) { stopifnot(is.character(pkg), length(pkg) == 1) stopifnot(is.character(generic), length(generic) == 1) stopifnot(is.character(class), length(class) == 1) - + if (is.null(fun)) { fun <- get(paste0(generic, ".", class), envir = parent.frame()) } else { stopifnot(is.function(fun)) } - + if (pkg %in% loadedNamespaces()) { registerS3method(generic, class, fun, envir = asNamespace(pkg)) } - + # Always register hook in case package is later unloaded & reloaded setHook( packageEvent(pkg, "onLoad"), diff --git a/tests/testthat/test_boxes.R b/tests/testthat/test_boxes.R index 68c800b..999d8cb 100644 --- a/tests/testthat/test_boxes.R +++ b/tests/testthat/test_boxes.R @@ -20,7 +20,7 @@ test_that('both from and to are required when requesting boxes, error otherwise' test_that('a list of boxes with phenomenon filter returns only the requested phenomenon', { check_api() - boxes = osem_boxes(phenomenon = 'Temperatur', date=Sys.time()) + boxes = osem_boxes(phenomenon = 'Temperatur', date = Sys.time()) expect_true(all(grep('Temperatur', boxes$phenomena))) })