diff --git a/hapi.r b/hapi.r index edf3540..b4d010b 100644 --- a/hapi.r +++ b/hapi.r @@ -1,89 +1,105 @@ library(RJSONIO) library("stringr") - -hapi <- function(...) { - args = list(...) - if (length(args) == 0) { - url = "https://github.com/hapi-server/servers/raw/master/all.txt" +library(data.table) +hapi <- function(server = NULL, dataset = NULL, parameters = NULL, start = NULL, stop = NULL) { + if (is.null(server)) { + url <- "https://github.com/hapi-server/servers/raw/master/all.txt" print(paste("hapi(): Downloading", url, sep=" ")) - servers = read.csv(url, header=FALSE) - return(servers["V1"][[1]]) + servers <- data.table::fread(url, header=FALSE) + return(servers[[1]]) } - if (length(args) == 1) { - url = paste(args[1], "catalog", sep="") + if (is.null(dataset)) { + url <- paste(server, "catalog", sep="") print(paste("hapi(): Downloading", url, sep=" ")) - catalog = fromJSON(url) + catalog <- fromJSON(url) return(catalog) } - if (length(args) == 2) { - url = paste(args[1], "info?id=", args[2], sep="") + if (is.null(parameters)) { + url <- paste(server, "info?id=", dataset, sep="") print(paste("hapi(): Downloading", url, sep=" ")) - info = fromJSON(url) + info <- fromJSON(url) return(info) } - if (length(args) == 3) { - url = paste(args[1], "info?id=", args[2], "¶meters=", args[3], sep="") + if (is.null(start)) { + url <- paste(server, "info?id=", dataset, "¶meters=", parameters, sep="") print(paste("hapi(): Downloading", url, sep=" ")) - info = fromJSON(url) + info <- fromJSON(url) return(info) } - if (length(args) == 5) { - - # TODO: Why [[]] needed here? - meta = hapi(args[[1]], args[[2]], args[[3]]) + if (is.null(stop)){ + stop("must enter a stop value") + } - url = paste(args[[1]], "data?id=", args[[2]], "¶meters=", args[[3]], "&time.min=", args[4], "&time.max=", args[5], sep="") - print(paste("hapi(): Downloading", url, sep=" ")) - csv = read.csv(url, header=FALSE) + meta <- hapi(server, dataset, parameters) - parameters = unlist(strsplit(paste("Time", args[3], sep=","), ",")) + url <- paste(server, "data?id=", dataset, "¶meters=", parameters, "&time.min=", start, "&time.max=", stop, sep="") + print(paste("hapi(): Downloading", url, sep=" ")) + csv <- data.table::fread(url) + + parameters <- unlist(strsplit(paste("Time", parameters, sep=","), ",")) # Put each column from csv into individual list element - data = list(csv[, 1]) + data <- list(csv[, 1]) # Number of rows (time values) - Nr = length(data[[1]]) + Nr <- nrow(data[[1]]) - k = 2 - for (i in 2:length(parameters)) { - if ("size" %in% names(meta["parameters"][[1]][[i]])) { - size = meta["parameters"][[1]][[i]][['size']] - } else { - size = 1 - } - - size = as.integer(size) - - # Number of columns of parameter - Nc = prod(size) - - print(paste("Extracting columns ", k, "through", (k+Nc+1)), sep="") - data <- c(data, list(csv[, k:(k+Nc-1)])) - - if (FALSE) { - size = array(size) - - # Prepend number of rows (number of time values) so that - # size = array(Nr, Nc[1], Nc[2], ...) - size = append(size, Nr, 0) - - print(paste("Extracting columns ", k, "through", (k+Nc+1)), sep="") - - # Extract columns and re-shape to have shape Nr, Nc[1], Nc[2], ... - data2 = array(data.matrix(csv[, k:(k+Nc-1)]), size) + k = 2 + for (i in 2:length(parameters)) { + if ("size" %in% names(meta$parameters[[i]])) { + size <- meta$parameters[[i]]$size + } else { + size <- 1 + } + # Number of columns of parameter + Nc <- prod(size) + print(paste("Extracting columns ", k, "through", (k+Nc-1)), sep="") - # Add to named list (not working properly) - data <- c(data, data2) + #convert into a matrix in order to convert into an array + data2 <- data.matrix(as.factor(unlist((csv[, k:(k+Nc-1)])))) + dim(data2) <- c(Nr, Nc) + listfinal <- c() + for(p in 1:Nr){ + if(length(size) == 1){ + size <- append(1,size) } - k = k + Nc - + currentcol <- 1 + ncolumns <- size[1] * size[2] + nmat <- Nc/ncolumns + listmat <- list() + for(m in 1:nmat){ + dataformat <- data2[p,currentcol:(currentcol + ncolumns - 1)] + dim(dataformat) <- c(size[2],size[1]) + dataformat <- t(dataformat) + listmat[[m]] <- dataformat + currentcol <- currentcol + ncolumns + } + matvec <- c() + for(l in 1:nmat){ + matvec <- append(matvec, listmat[[l]]) + } + array_cur <- array(matvec, dim = size) + listfinal[[p]] <- array_cur } + finalvec <- c() + for(val in 1:Nr){ + finalvec <- append(finalvec, listfinal[[p]]) + } + size <- append(size, Nr) + data_final <- array(finalvec, dim = size) + + + data <- c(data, list(data_final)) + + k <- k + Nc + + } # Add names based on request parameters # If args[3] = "param1,param2", the following is equivalent to # e.g., names(data) <- c("Time", "param1", "param2") - names(data) <- c(parameters) - - return(data) - } + names(data) <- c(parameters) + + return(data) + } diff --git a/hapi_demo.r b/hapi_demo.r index 7b49f63..ae0f51e 100644 --- a/hapi_demo.r +++ b/hapi_demo.r @@ -1,41 +1,65 @@ -# TODO: Make this a relative path. -source("/Users/weigel/git/hapi/client-r/hapi.r") +#it is best to not source a file, we should create a package eventually +source("C:/Users/Dan/hapi/hapi.r") if (FALSE) { - servers = hapi() + servers <- hapi() print(servers) - catalog = hapi("http://hapi-server.org/servers/TestData2.0/hapi/") - #catalog = hapi("http://hapi-server.org/servers/SSCWeb/hapi/") + catalog <- hapi("http://hapi-server.org/servers/TestData2.0/hapi/") + #catalog <- hapi("http://hapi-server.org/servers/SSCWeb/hapi/") - for (i in 1:length(catalog[[1]])) { - print(catalog[[1]][[i]]["id"][[1]]) + for (i in 1:length(catalog$catalog)) { + print(catalog$catalog[[i]][["id"]]) } - info = hapi("http://hapi-server.org/servers/TestData2.0/hapi/", "dataset1") - for (i in 1:length(info["parameters"][[1]])) { - print(info["parameters"][[1]][[i]][["name"]]) + #This does not work, I cannot not tell what the intended output is + #I added five options below that print different things + info <- hapi("http://hapi-server.org/servers/TestData2.0/hapi/", "dataset1") + for (i in 1:length(info$parameters[[1]])) { + print(info$parameters[[1]][[i]][["name"]]) } - - server = "http://hapi-server.org/servers/TestData2.0/hapi/" - dataset = "dataset1" - parameters = "scalar,scalarstr" - start = "1970-01-01Z" - stop = "1970-01-01T00:00:11Z" - data = hapi(server, dataset, parameters, start, stop) + #option 1: prints the contents of each item in each list + info <- hapi("http://hapi-server.org/servers/TestData2.0/hapi/", "dataset1") + for (i in 1:length(info$parameters[[1]])) { + print(info$parameters[[1]][[i]]) + } + + #option 2: DOES NOT USE FOR LOOP, prints the name value + info <- hapi("http://hapi-server.org/servers/TestData2.0/hapi/", "dataset1") + print(info$parameters[[1]]$name) + + #option 3: DOES NOT USE FOR LOOP, prints the name value as a list + info <- hapi("http://hapi-server.org/servers/TestData2.0/hapi/", "dataset1") + print(info$parameters[[1]][1]) + + #option 4: prints each item as a list + info <- hapi("http://hapi-server.org/servers/TestData2.0/hapi/", "dataset1") + for (i in 1:length(info$parameters[[1]])) { + print(info$parameters[[1]][i]) + } + + #option 5: prints the name of each item in the list, DOES NOT USE LOOP + info <- hapi("http://hapi-server.org/servers/TestData2.0/hapi/", "dataset1") + names(info$parameters[[1]]) + + server <- "http://hapi-server.org/servers/TestData2.0/hapi/" + dataset <- "dataset1" + parameters <- "scalar,scalarstr" + start <- "1970-01-01Z" + stop <- "1970-01-01T00:00:11Z" + + data <- hapi(server, dataset, parameters, start, stop) data } -server = "http://hapi-server.org/servers/TestData2.0/hapi/" -dataset = "dataset1" -parameters = "transformmulti" -start = "1970-01-01Z" -stop = "1970-01-01T00:00:11Z" +server <- "http://hapi-server.org/servers/TestData2.0/hapi/" +dataset <- "dataset1" +parameters <- "transformmulti" +start <- "1970-01-01Z" +stop <- "1970-01-01T00:00:11Z" #meta = hapi(server, dataset, parameters) -data = hapi(server, dataset, parameters, start, stop) +data <- hapi(server, dataset, parameters, start, stop) data - -# Want data['transformmulti'] to be a matrix with dimensions (10,3,3)