#' generic function to pull GA data
#' @description generic function to pull GA data; it performs a single query
#' @details Function is atomic, performing one query, for one GA view, for a given period of time
#' @import googleAnalyticsR
#' @import data.table
#' @param parameters a structured list with parameters
#' @param ga_view_id an ID of Google Analytics view
#' @param dates_interval an interval to pull data
#' @export
pull_ga_data <- function(parameters, ga_view_id, dates_interval){
metrics <- parameters$metrics
dimensions <- parameters$dimensions
start_date <- lubridate::int_start(dates_interval) %>% as.Date()
end_date <- lubridate::int_end(dates_interval) %>% as.Date()
if (!is.null(parameters$segment)) seg_obj <- googleAnalyticsR::segment_ga4("Sellwerk segment nickname", segment_id = parameters$segment) else (seg_obj <- NULL)
if (!is.null(parameters$filter)) filter <- googleAnalyticsR::filter_clause_ga4(parameters$filter, operator = "AND") else (filter <- NULL)
ga_data_raw <- googleAnalyticsR::google_analytics(ga_view_id,
date_range = c(start_date, end_date),
metrics = metrics, dimensions = dimensions,
segments = seg_obj,
dim_filters = filter,
max = -1, anti_sample = T)
ga_dt <- ga_data_raw
setDT(ga_dt)
return(ga_dt)
}
#' Pull a list of queries for a given ga_view_id
#' @description Pull a list of queries for a given ga_view_id
#' @import googleAuthR
#' @importFrom rlist list.match
#' @importFrom here here
#' @param ga_view_id an ID of Google Analytics view
#' @param queries_list a list of queries
#' @param dates_interval an interval to pull data
#'
#' @export
pull_ga_data_set <- function(ga_view_id, queries_list, dates_interval){
#-- authentication
googleAuthR::gar_auth(here::here(".httr-oauth")) #-- authentication using token
#-- query itself, all the sub-queries for a given view; it returns a list, with a one element per query
dt_list <- purrr::map(queries_list, pull_ga_data, ga_view_id, dates_interval)
return(dt_list)
}
#' Pulling data to chart sunburst
#' @description complete sequence to pull data needed for sunburst for a given period
#' @details we are defining list of queries, and call function [pull_ga_data_set()] for each element on a list
#' @importFrom rlist list.match list.names list.ungroup
#' @param dates_interval a period to use while pulling the data
#'
#' @export
pull_sunburst_data <- function(dates_interval) {
ga_account <- config$ga_account
ga_max_results <- config$ga_max_result
#ga_views_subset <- config$ga_view
#-- define list of queries, as a reference; we can have more queries than we use in a particular application
ga_queries_list <- list(
sellwerk_1_of_5 = list(metrics = c("ga:users"),
dimensions = c("ga:dimension20", "ga:date", "ga:deviceCategory", "ga:campaign", "ga:sourceMedium", "ga:sessionCount")),
sellwerk_2_of_5 = list(metrics = c("ga:users"),
dimensions = c("ga:dimension2", "ga:dimension15", "ga:dimension16", "ga:dimension17", "ga:dimension20",
"ga:pagePath")),
sellwerk_3_of_5 = list(metrics = c("ga:totalEvents"),
dimensions = c("ga:dimension2", "ga:dimension3", "ga:dimension4", "ga:dimension7", "ga:dimension15",
"ga:dimension16", "ga:dimension20"),
segment = c("gaid::evmYLN5FSdyl9JpB2ekbsQ"))
# segment = segment_element("eventAction",
# operator = "EXACT",
# type = "DIMENSION",
# expression = "Login Success",
# scope = "SESSION"))
)
#-- select a subset of queries, which we are using right now, using string match
ga_queries_subset_pattern <- list("1|3") # limit to queries 1, 3
ga_queries_subset_list <- rlist::list.match(ga_queries_list, ga_queries_subset_pattern)
#-- pull the data
ga_views_identifiers = c("Sellwerk" = "ga:233250370")
ga_views_subset <- ga_views_identifiers["Sellwerk"]
ga_dt_list <- purrr::map(ga_views_subset, pull_ga_data_set, ga_queries_subset_list, dates_interval)
#-- unlist to a data.table structure
queries_list <- ga_queries_subset_list %>% rlist::list.names()
dt_list <- lapply(queries_list, function(x) {
dt <- rlist::list.select(ga_dt_list, eval(as.name(x))) %>%
list.ungroup(group.names = TRUE) %>%
rbindlist(use.names = TRUE, idcol = TRUE) %>%
setDT()
dt[, `:=` (query = x)]
setnames(dt, ".id", "ga_view", skip_absent = T)
return(dt)
})
names(dt_list) <- queries_list
#dt <- rbindlist(dt_list, use.names = T, fill = T)
return(dt_list)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.