🧭 Xuleta Openair

Guia visual definitiva per treballar amb openair sense errors. Pensada per tenir oberta o impresa mentre programes.

📦 Arguments i estructura

mydata és quasi sempre obligatori

timeVariation(mydata = df, pollutant = "NO2")
timeVariation(df, pollutant = "NO2")  # forma curta (menys clara)
    
👉 En wrappers i scripts llargs: usa sempre mydata =
✅ Format long recomanat

date | pollutant | value
    
👉 openair està pensat per dades “long”, no “wide”

🕒 Dates i temps

✅ Dates ordenades i duplicats reals controlats

# ❌ NO suficient en dades long
# any(duplicated(df$date))

# ✅ Duplicats reals (mateixa data + mateix pollutant)
any(duplicated(df[, c("date", "pollutant")]))

# Comprova ordre temporal
is.unsorted(df$date)

# Ordena sempre (segur)
df <- df[order(df$date), ]
    
👉 Duplicats “bons” (mateixa data, pollutant diferent) són normals
👉 Duplicats “dolents” (mateixa data + pollutant) trenquen openair
⚠️ Zona horària sempre definida

df$date <- as.POSIXct(df$date, tz = "UTC")
    
👉 Errors horaris = gràfics estranys

🏷️ Factors i categories

✅ Elimina nivells buits dels factors

df$pollutant <- droplevels(df$pollutant)
df$site      <- droplevels(df$site)
    
⚠️ Evita NA a type

table(df$pollutant, useNA = "ifany")
    

📊 Contingut de dades

✅ No passis pollutants inexistents

poll_ok <- intersect(
  c("NO2","PM10","O3"),
  levels(df$pollutant)
)
    
⚠️ Comprova cobertura temporal

df %>%
  group_by(pollutant) %>%
  summarise(ndays = n_distinct(as.Date(date)))
    
👉 Menys de 3–4 setmanes = resultats pobres
⚠️ Normalise només amb dades bones

timeVariation(df, pollutant = "NO2", normalise = FALSE)
    
✅ Revisa unitats

summary(df$value)
    

📤 Resultats i scripts

✅ Guarda l’output, no només el plot

tv <- timeVariation(df, pollutant = "NO2", plot = FALSE)
str(tv$data)
    
silent = TRUE en scripts llargs

timeVariation(df, pollutant = "NO2", silent = TRUE)
    

🛠️ Debug ràpid (quan openair “no pinta res”)

❌ Checklist mínima

stopifnot(
  inherits(df$date, "POSIXct"),
  !is.unsorted(df$date),
  !any(duplicated(df[, c("date", "pollutant")])),
  nrow(df) > 0
)
    
❌ Error sense missatge clar

traceback()
options(error = recover)