diff --git a/inst/script/friendlyr.R b/inst/script/friendlyr.R new file mode 100644 index 0000000000000000000000000000000000000000..a4816869ab2e4addc56c2db4863f24599f918974 --- /dev/null +++ b/inst/script/friendlyr.R @@ -0,0 +1,201 @@ +#!/usr/lib/R/bin/Rscript + +# Jean-Marie Lepioufle +# NILU - nilu.no +# 2019-02-21 +# Get timeseries from a service by using friendlyr + +'friendlyr + +Usage: + friendlyr.R -service <service> -fromDate <fromDate> -toDate <toDate> -precision <precision> -timeResolution <timeResolution> -element_id <element_id> -station_id <station_id> -username <username> -password <password> -result <result> -name <name> + conv.R (-h | --help) + conv.R --version + +Options: + -h --help Show this screen. + --version Show version. + +Outcomes: + timeserie: Timeserie of as a friendlyts data.frame. + +' -> doc + + +#library(docopt) +arguments <- docopt::docopt(doc, version = 'conv version 0.0.1') + +################### +# requirement # +################### +suppressPackageStartupMessages(require("friendlyr")) + +################### +# init parameters # +################### + +cat("Initialising parameters... \n") + + +service <- tryCatch({ + + res <- as.character(arguments$service) + if(!(res %in% c("luftlyr","innoly","frostlyr","d.luft.oslyr","d.eipalyr","d.eimetlyr"))) stop("'service' need to be one of these: 'luftlyr','innoly','frostlyr','d.luft.oslyr','d.eipalyr','d.eimetlyr'") + res + +}, error = function(err) { + + print(paste("Error in argument 'service': ",err)) + print("It will crash.") + +}) + +fromDate <- tryCatch({ + + res <- as.character(arguments$fromDate) + # add some filter + res + +}, error = function(err) { + + print(paste("Error in argument 'fromDate': ",err)) + print("It will crash.") + +}) + + +toDate <- tryCatch({ + + res <- as.character(arguments$toDate) + # add some filter + res + +}, error = function(err) { + + print(paste("Error in argument 'toDate': ",err)) + print("It will crash.") + +}) + +precision <- tryCatch({ + + res <- as.character(arguments$precision) + if(!(res %in% c("second","minute","hourly","daily","monthly","yearly"))) stop("'service' need to be one of these: 'second','minute','hourly','daily','monthly','yearly'") + res + +}, error = function(err) { + + print(paste("Error in argument 'precision': ",err)) + print("It will crash.") + +}) + +timeResolution <- tryCatch({ + + res <- as.character(arguments$timeResolution) + if(!(res %in% c("second","minute","hourly","daily","monthly","yearly"))) stop("'service' need to be one of these: 'second','minute','hourly','daily','monthly','yearly'") + res + +}, error = function(err) { + + print(paste("Error in argument 'timeResolution': ",err)) + print("It will crash.") + +}) + +element_id <- tryCatch({ + + res <- as.character(arguments$element_id) + # add some filter + res + +}, error = function(err) { + + print(paste("Error in argument 'element_id': ",err)) + print("It will crash.") + +}) + +station_id <- tryCatch({ + + res <- as.character(arguments$station_id) + # add some filter + res + +}, error = function(err) { + + print(paste("Error in argument 'station_id': ",err)) + print("It will crash.") + +}) + +username <- tryCatch({ + + res <- as.character(arguments$username) + # add some filter + res + +}, error = function(err) { + + print(paste("Error in argument 'username': ",err)) + print("It will crash.") + +}) + +password <- tryCatch({ + + res <- as.character(arguments$password) + # add some filter + res + +}, error = function(err) { + + print(paste("Error in argument 'password': ",err)) + print("It will crash.") + +}) + +# get path of where to store the result +result <- tryCatch({ + + res <- normalizePath(file.path(as.character(arguments$result),"friendlyr"),mustWork = FALSE) + dir.create(res, showWarnings = FALSE, recursive = TRUE) + res + +}, error = function(err) { + + print(paste("Error in argument 'result': ",err)) + print("'result' get its default value: '~'") + + res <- normalizePath(file.path(path.expand('~'),"friendlyr"),mustWork = FALSE) + dir.create(res, showWarnings = FALSE, recursive = TRUE) + return(res) + +}) + + +name <- tryCatch({ + + res <- as.character(arguments$name) + # add some filter + res + +}, error = function(err) { + + print(paste("Error in argument 'name': ",err)) + print("It will crash.") + +}) + + +####################### +# get timeseries data # +####################### +df <- friendlyr::ts(service=service,username=username,password=password, + fromDate=fromDate,toDate=toDate,precision=precision,timeResolution=timeResolution, + element_id=element_id,station_id=station_id) + + +#save +pathfile <- normalizePath(file.path(path, paste0(name,".csv")),mustWork = FALSE) +write.csv(df,file=pathfile,row.names=FALSE) diff --git a/inst/script/readme.md b/inst/script/readme.md new file mode 100644 index 0000000000000000000000000000000000000000..690d4e8855ae5e8d154e6edc9010403d22b4819f --- /dev/null +++ b/inst/script/readme.md @@ -0,0 +1,163 @@ +## Friendlyr in bash + +Author: Jean-Marie Lepioufle, [NILU](https://nilu.no). + +Date: 2019-02-21. + +**Purpose** : + +- Gathering long timeseries from different internal and external services. + +**Available services** : + +- luftkval (NILU): "luftlyr" +- innosense (NILU): "innolyr" +- frost (MET): "frostlyr" +- embedded dataset luftkval.oslo10: "d.luft.oslyr" +- embedded dataset EPA Ireland: "d.eipalyr" +- embedded dataset MetOffice Ireland: "d.eimetlyr" + +**Component** : + +- friendlyr.sh: run friendlyr.R with possibility of asynchronous loop. +- friendlyr.R: Gather data + +**Remarks** : + +Friendlyr required installation of libraries from NILU's gitlab. + +A full frontend version of friendlyr is available through [rØya](https://git.nilu.no/oya/roya) service + +### Pre-requisities + +#### Get easily command-line interface through Rscript. + +In order to get a command-line interface through Rscript, you need to install docopt packages in R. + +```R +install.packages("docopt") +``` +#### Get the right packages to run the case study + +The package batqa and its dependencies enable to optimize a model. +For our case study, and as suggested in batqa DESCRIPTION, need one to install other packages: metrics, friendlyr, d.luft.oslyr, friendlyts and ranger. + +```R +# devtools Version: 2.0.1.9000 +# devtools::install_github("r-lib/devtools") +library("devtools") +devtools::install_git("https://git.nilu.no/rfriendlyr/friendlyr.git") +``` + +#### R script as executables +The path to Rscript listed in the shebang line of the file friendlyr.R needs to be in your PATH variable. + +Check the path of your Rscript. +```shell +which Rscript +``` +Then paste it into your .bashrc +```shell +echo 'export PATH="$PATH:/usr/lib/R/bin/Rscript"' >> ~/.bashrc +``` + +The script friendlyr.R needs then to be executable. + +```shell +cd </path/to/friendlyr.R> + +chmod +x friendlyr.R +``` +Then the script friendlyr.R is executable by writing: + +```shell +./friendlyr.R -service <service> -fromDate <fromDate> -toDate <toDate> -precision <precision> -timeResolution <timeResolution> -element_id <element_id> -station_id <station_id> -username <username> -password <password> -result <result> -name <name> +``` + + +#### shell script as executable +In order to gather long timeseries of data, the request is splitted. The script friendly.sh focuses on this. + +The script friendlyr.sh needs to be executable. + +```shell +cd </path/to/friendlyr.sh> + +chmod +x friendlyr.sh +``` +Then the script friendlyr.sh is executable by writing: + +```shell + . ./friendlyr.sh <service> <fromDate> <toDate> <precision> <timeResolution> <element_id> <station_id> <username> <password> <result> +``` + + + +### Usage + +Parameters <station> and <batea_type> are always arrays. + +```shell + +# example 1 +cd </path/to/bat_oslo.R> + +./friendlyr.R -service "frostlyr" -fromDate "2016/11/6 00:00:00" -toDate "2016/11/10 00:00:00" -precision "hourly" -timeResolution "hourly" -element_id "air_temperature" -station_id "SN18700" -username "****" -password "*****" -result "~/" -name "1" + +# example 2 + +cd </path/to/bat_oslo.sh> + +element_id=("7") +b_type=("r") +./friendlyr.R -service "frostlyr" -fromDate "2016/11/6 00:00:00" -toDate "2016/11/10 00:00:00" -precision "hourly" -timeResolution "hourly" -element_id "air_temperature" -station_id "SN18700" -username "****" -password "*****" -result "~/" -name "1" + +# example 2 +station=("7" "11" "9") +b_type=("r") +. ./bat_oslo.sh "1" station b_type "mh_pw" 10 "~/" + +# example 3 +station=("7" "11" "9") +b_type=("r" "or" "sor") +. ./bat_oslo.sh "1" station b_type "mh_pw" 10 "~/" + +``` + + +```R + + + +# dates +timeResolution <- "hourly" +precision <- "hourly" +fromDate <- "2013010100" +toDate <- "2018060100" +tmp <- timemanip::timeserie(timeResolution="monthly",fromPeriod=fromDate,toPeriod=toDate,precision=precision) + +from <- tmp$seqPeriod[1:(tmp$nbStep-1)] + +to <- tmp$seqPeriod[2:(tmp$nbStep)] +if (length(to)>1) { + to[1:(length(to)-1)] <- timemanip::addition_nonsec(to[1:(length(to)-1)],timeResolution=timeResolution,v=-1) +} + + +# elements +element_id <- c("sum(precipitation_amount PT1H)", + "wind_from_direction", + "wind_speed", + "surface_air_pressure", + "mean(surface_downwelling_shortwave_flux_in_air PT1H)", + "air_temperature", + "relative_humidity") + + +# stations +location <- "Oslo, Norway" +frost_meta <- friendlyr::meta(service="frostlyr",element_id=element_id,location=location,username=username,password=password) +station_id <- as.character(frost_meta$ID) + + +```