--- title: "Getting started with IMF SDMX 3.0 data" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Getting started with IMF SDMX 3.0 data} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", eval = FALSE ) ``` `imf.data` follows a four-step workflow: find a dataflow, inspect its dimensions, inspect valid values, and download observations. ## Find a dataflow ```{r} library(imf.data) datasets <- list_datasets("IMF.STA") datasets[datasets$id == "CPI", ] ``` Dataflows are identified by an agency, ID, and version. Most examples in this guide use the IMF Statistics Department agency, `IMF.STA`. ## Inspect dimensions ```{r} dimensions <- list_dimensions("CPI") dimensions ``` The returned order is the order used by an SDMX series key. For the higher-level workflow, use dimension names in a named `filters` list instead of assembling a positional key. ## Inspect available values ```{r} list_dimension_values( "CPI", "FREQUENCY", filters = list(COUNTRY = "USA") ) ``` Availability is conditional. Adding filters for other dimensions narrows the codes returned for the requested dimension. ## Download observations ```{r} cpi <- get_data( "CPI", filters = list( COUNTRY = c("USA", "CAN"), INDEX_TYPE = "CPI", COICOP_1999 = "_T", TYPE_OF_TRANSFORMATION = "IX", FREQUENCY = "M" ), start_period = "2020", last_n_obs = 12, attributes = c("SCALE", "STATUS") ) cpi ``` The result contains one row per observation. SDMX dimensions and `TIME_PERIOD` are character columns, while `OBS_VALUE` is numeric. Use `first_n_obs` or `last_n_obs` to limit observations per matching series. The two arguments cannot be combined. ## Reshape for comparison `get_data()` returns one row per observation, which is convenient for plotting and analysis but awkward for comparing countries side by side. Reshape it to one column per country with base R: ```{r} wide <- reshape( cpi[c("COUNTRY", "TIME_PERIOD", "OBS_VALUE")], idvar = "TIME_PERIOD", timevar = "COUNTRY", direction = "wide" ) wide[order(wide$TIME_PERIOD), ] ``` ## Handle validation errors `get_data()` and the raw `sdmx_*()` functions validate their arguments before contacting the API, so mistakes raise an informative error instead of an opaque HTTP failure: ```{r} tryCatch( get_data( "CPI", filters = list(COUNTRY = "USA"), first_n_obs = 1, last_n_obs = 1 ), error = function(e) conditionMessage(e) ) ``` Use `list_dimension_values()` to confirm a code is valid for the current dataflow before retrying. ## Use the raw API The raw functions preserve the complete nested SDMX response: ```{r} raw <- sdmx_data( "CPI", key = "USA.CPI._T.IX.M", last_n_obs = 2 ) availability <- sdmx_availability( "CPI", component_id = "FREQUENCY", filters = list(COUNTRY = "USA"), mode = "available" ) metadata <- sdmx_metadata(detail = "allstubs") ``` Raw JSON responses are unsimplified lists so their zero-based SDMX indexes can be decoded without losing structure. XML responses are available as text by setting `format = "xml"`. ## Configure a proxy httr2 automatically respects standard environment variables such as `HTTPS_PROXY`, `HTTP_PROXY`, and `NO_PROXY`. To configure a proxy only for `imf.data`, use: ```{r} set_imf_proxy( "http://proxy.example.com", port = 8080, username = Sys.getenv("PROXY_USER"), password = Sys.getenv("PROXY_PASSWORD") ) ``` This configuration applies to every package request in the current R session. Remove it with: ```{r} clear_imf_proxy() ``` Keep credentials in environment variables or another secrets manager rather than writing them directly into scripts.