I have this R function where i make some computations like average and median of such values comes from a website. fromTime
and toTime
are two dates in a string format like 2020-10-12. computationType
is a string that specify the type of computation like average or median. new_suri
is a serviceUri (string) and sensor
is also a string. I have a problem in the second for
(that is the same in the second part of the function) where i do this:
Take the "i" element of value
and add this element to another list called valori
. After this check if there is some error in this "i" element. If some of the conditions in the if
statement is met then remove the "i" element from valori
.
I would like the element to be deleted and then the list to return to its original length. The length I would have had without that element. But i obtain the error that you can see below
dayHour <- function(fromTime,toTime,dayOfTrend,computationType,new_suri,sensor){
errorList <- list()
valori <- vector(mode = "double")
dayHourValues <- list()
dayOTList <- list()
hour <- c("00","01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23")
interval <- as_date(ymd(fromTime):ymd(toTime)) # giorni presenti tra le due date "fromTime" e "toTime"
for(a in 1:length(interval)) {
if(strftime(interval[[a]], '%A') == dayOfTrend){
element <- as.character.Date(interval[[a]])
dayOTList <- c(dayOTList, element) # Lista dei giorni che servono per calcolare il trend in funzione del dayOfTrend (es. tutti i lunedì)
}
}
for (j in 1:length(hour)) {
if (j == 24){
for (y in 1:length(dayOTList)) {
from <- paste(hour[[j]],":00:00", sep = "")
to <- paste(hour[[j]],":59:59", sep = "")
fromDateTime <- paste(dayOTList[[y]],"T",hour[[j]],":00:00", sep = "") #yyyy-mm-ddThh:mm:ss
toDateTime <- paste(dayOTList[[y]],"T",hour[[j]],":59:59", sep = "") #yyyy-mm-ddThh:mm:ss
# Costruisco la query per ottenere i dati richiesti
api <- paste("SERVICEURI",
new_suri,
"&valueName=",
sensor,
"&fromTime=",
fromDateTime,
"&toTime=",
toDateTime,
sep="")
# Invio la chiamata e la parso sotto forma di JSON in res
res <- fromJSON(api)
# Prendo il blocco di valori che contiene quel sensore
value <- res$realtime$results$bindings
# Estrapolo il valore richiesto che si trova sotto il nome di sensor
value <- getElement(value,sensor)
for (i in 1:length(value)) {
valori <- c(valori,as.numeric(value[[i]]))
if (is.na(valori[[i]])){
valori[[i]] <- paste("error", sep = "")
errorList <- c(errorList,"In this time span: ",dayOTList[[y]],":",from, " to ", to, " there is a wrong value")
}else if(is.null(valori[[i]])){
valori[[i]] <- paste("error", sep = "")
errorList <- c(errorList,"In this time span: ",dayOTList[[y]],":",from, " to ", to, " there is a wrong value")
}else if(sensor == "averageSpeed" & valori[[i]] >= 130){
valori[[i]] <- paste("error", sep = "")
errorList <- c(errorList,"In this time span: ",dayOTList[[y]],":",from, " to ", to, " there is a wrong value")
}else if(sensor == "concentration" & valori[[i]] >= 900){
valori[[i]] <- paste("error", sep = "")
errorList <- c(errorList,"In this time span: ",dayOTList[[y]],":",from, " to ", to, " there is a wrong value")
}else if(sensor == "vehicleFlow" & valori[[i]] >= 900){
valori[[i]] <- paste("error", sep = "")
errorList <- c(errorList,"In this time span: ",dayOTList[[y]],":",from, " to ", to, " there is a wrong value", "\n")
}else{
print("All is ok!")
}
}
valori <- valori[!str_detect(valori, pattern = "error")]
}
if(computationType == "average"){
computedValues <- mean(valori) # calcolo la media dei valori nell'intervallo orario per ogni data presente nella lista
}else{
computedValues <- median(valori) # calcolo la mediana dei valori nell'intervallo orario per ogni data presente nella lista
}
valori <- vector(mode = "double") # pulisco la lista che deve contenere gli altri valori per una nuova fascia oraria
dayHourValues <- c(dayHourValues,computedValues)
computedValues <- list()
}else{
for (y in 1:length(dayOTList)) {
from <- paste(hour[[j]],":00:00", sep = "")
to <- paste(hour[[j+1]],":00:00", sep = "")
fromDateTime <- paste(dayOTList[[y]],"T",from, sep = "") #Tyyyy-mm-ddThh:mm:ss
toDateTime <- paste(dayOTList[[y]],"T",to, sep = "") #Tyyyy-mm-ddThh:mm:ss
# Costruisco la query per ottenere i dati richiesti
api <- paste("SERVICEURI=",
new_suri,
"&valueName=",
sensor,
"&fromTime=",
fromDateTime,
"&toTime=",
toDateTime,
sep="")
# Invio la chiamata e la parso sotto forma di JSON in res
res <- fromJSON(api)
# Prendo il blocco di valori che contiene quel sensore
value <- res$realtime$results$bindings
# Estrapolo il valore richiesto che si trova sotto il nome di sensor
value <- getElement(value,sensor)
for (i in 1:length(value)) {
valori <- c(valori,as.numeric(value[[i]]))
if (is.na(valori[[i]])){
valori[[i]] <- paste("error", sep = "")
errorList <- c(errorList,"In this time span: ",dayOTList[[y]],":",from, " to ", to, " there is a wrong value")
}else if(is.null(valori[[i]])){
valori[[i]] <- paste("error", sep = "")
errorList <- c(errorList,"In this time span: ",dayOTList[[y]],":",from, " to ", to, " there is a wrong value")
}else if(sensor == "averageSpeed" & valori[[i]] >= 130){
valori[[i]] <- paste("error", sep = "")
errorList <- c(errorList,"In this time span: ",dayOTList[[y]],":",from, " to ", to, " there is a wrong value")
}else if(sensor == "concentration" & valori[[i]] >= 900){
valori[[i]] <- paste("error", sep = "")
errorList <- c(errorList,"In this time span: ",dayOTList[[y]],":",from, " to ", to, " there is a wrong value")
}else if(sensor == "vehicleFlow" & valori[[i]] >= 900){
valori[[i]] <- paste("error", sep = "")
errorList <- c(errorList,"In this time span: ",dayOTList[[y]],":",from, " to ", to, " there is a wrong value", "\n")
}else{
print("All is ok!")
}
}
valori <- valori[!str_detect(valori, pattern = "error")]
}
if(computationType == "average"){
computedValues <- mean(valori) # calcolo la media dei valori nell'intervallo orario per ogni data presente nella lista
}else{
computedValues <- median(valori) # calcolo la mediana dei valori nell'intervallo orario per ogni data presente nella lista
}
valori <- vector(mode = "double") # pulisco la lista che deve contenere gli altri valori per una nuova fascia oraria
dayHourValues <- c(dayHourValues,computedValues)
computedValues <- list()
}
}
return(returnList <- list("values" = dayHourValues, "error" = errorList)) # Ritorna lista dei 24 valori tipici
}
And now i obtain this error:
Error in valori[[i]] <- NULL : replacement has length zero
In addition: Warning messages:
1: In if (is.na(value[[i]])) { :
the condition has length > 1 and only the first element will be used
2: In if (sensor == "averageSpeed" & value[[i]] >= 130) { :
the condition has length > 1 and only the first element will be used
Update: I solved the first problem, but now the problem is this:
[1] "All is ok!"
[1] "All is ok!"
[1] "All is ok!"
Error in valori[[i]] :
attempt to select less than one element in integerOneIndex
So i think that the problem is something like that