mirror of
https://github.com/sensebox/opensensmapr
synced 2025-02-22 23:23:57 +01:00
97 lines
3.2 KiB
R
97 lines
3.2 KiB
R
![]() |
## ----cache---------------------------------------------------------------
|
||
|
b = osem_boxes(cache = tempdir())
|
||
|
list.files(tempdir(), pattern = 'osemcache\\..*\\.rds')
|
||
|
|
||
|
# the next identical request will hit the cache only!
|
||
|
b = osem_boxes(cache = tempdir())
|
||
|
|
||
|
# requests without the cache parameter will still be performed normally
|
||
|
b = osem_boxes()
|
||
|
|
||
|
## ----cache_custom--------------------------------------------------------
|
||
|
cacheDir = getwd() # current working directory
|
||
|
b = osem_boxes(cache = cacheDir)
|
||
|
|
||
|
# the next identical request will hit the cache only!
|
||
|
b = osem_boxes(cache = cacheDir)
|
||
|
|
||
|
## ----clearcache----------------------------------------------------------
|
||
|
osem_clear_cache() # clears default cache
|
||
|
osem_clear_cache(getwd()) # clears a custom cache
|
||
|
|
||
|
## ----setup, results='hide'-----------------------------------------------
|
||
|
# this section requires:
|
||
|
library(opensensmapr)
|
||
|
library(jsonlite)
|
||
|
library(readr)
|
||
|
|
||
|
# first get our example data:
|
||
|
boxes = osem_boxes(grouptag = 'ifgi')
|
||
|
measurements = osem_measurements(boxes, phenomenon = 'PM10')
|
||
|
|
||
|
## ----serialize_json------------------------------------------------------
|
||
|
# serializing senseBoxes to JSON, and loading from file again:
|
||
|
write(jsonlite::serializeJSON(measurements), 'boxes.json')
|
||
|
boxes_from_file = jsonlite::unserializeJSON(readr::read_file('boxes.json'))
|
||
|
|
||
|
## ----serialize_attrs-----------------------------------------------------
|
||
|
# note the toJSON call
|
||
|
write(jsonlite::toJSON(measurements), 'boxes_bad.json')
|
||
|
boxes_without_attrs = jsonlite::fromJSON('boxes_bad.json')
|
||
|
|
||
|
boxes_with_attrs = osem_as_sensebox(boxes_without_attrs)
|
||
|
class(boxes_with_attrs)
|
||
|
|
||
|
## ----osem_offline--------------------------------------------------------
|
||
|
# offline logic
|
||
|
osem_offline = function (func, file, format='rds', ...) {
|
||
|
# deserialize if file exists, otherwise download and serialize
|
||
|
if (file.exists(file)) {
|
||
|
if (format == 'json')
|
||
|
jsonlite::unserializeJSON(readr::read_file(file))
|
||
|
else
|
||
|
readRDS(file)
|
||
|
} else {
|
||
|
data = func(...)
|
||
|
if (format == 'json')
|
||
|
write(jsonlite::serializeJSON(data), file = file)
|
||
|
else
|
||
|
saveRDS(data, file)
|
||
|
data
|
||
|
}
|
||
|
}
|
||
|
|
||
|
# wrappers for each download function
|
||
|
osem_measurements_offline = function (file, ...) {
|
||
|
osem_offline(opensensmapr::osem_measurements, file, ...)
|
||
|
}
|
||
|
osem_boxes_offline = function (file, ...) {
|
||
|
osem_offline(opensensmapr::osem_boxes, file, ...)
|
||
|
}
|
||
|
osem_box_offline = function (file, ...) {
|
||
|
osem_offline(opensensmapr::osem_box, file, ...)
|
||
|
}
|
||
|
osem_counts_offline = function (file, ...) {
|
||
|
osem_offline(opensensmapr::osem_counts, file, ...)
|
||
|
}
|
||
|
|
||
|
## ----test----------------------------------------------------------------
|
||
|
# first run; will download and save to disk
|
||
|
b1 = osem_boxes_offline('mobileboxes.rds', exposure='mobile')
|
||
|
|
||
|
# consecutive runs; will read from disk
|
||
|
b2 = osem_boxes_offline('mobileboxes.rds', exposure='mobile')
|
||
|
class(b1) == class(b2)
|
||
|
|
||
|
# we can even omit the arguments now (though thats not really the point here)
|
||
|
b3 = osem_boxes_offline('mobileboxes.rds')
|
||
|
nrow(b1) == nrow(b3)
|
||
|
|
||
|
# verify that the custom sensebox methods are still working
|
||
|
summary(b2)
|
||
|
plot(b3)
|
||
|
|
||
|
## ----cleanup, results='hide'---------------------------------------------
|
||
|
file.remove('mobileboxes.rds', 'boxes_bad.json', 'boxes.json', 'measurements.rds')
|
||
|
|