Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 77 additions & 61 deletions hapi.r
Original file line number Diff line number Diff line change
@@ -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], "&parameters=", args[3], sep="")
if (is.null(start)) {
url <- paste(server, "info?id=", dataset, "&parameters=", 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]], "&parameters=", 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, "&parameters=", 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)

}

74 changes: 49 additions & 25 deletions hapi_demo.r
Original file line number Diff line number Diff line change
@@ -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)