Как включить / исключить оператор фильтра в запросе R httr для Localytics - PullRequest
0 голосов
/ 12 марта 2020

Я могу успешно запрашивать данные из Localytics, используя R, например, в следующем примере:

r <- POST(url = "https://api.localytics.com/v1/query,
           body=list(app_id=<APP_ID>,
                     metrics=c("occurrences","users"),
                     dimensions=c('a:URI'),
                     conditions=list(day = c("between", "2020-02-11", "2020-03-12"),
                                     event_name = "Content Viewed",
                                     "a:Item URI" = "testing")
           ),
           encode="json",
           authenticate(Key,Secret),
           accept("application/json"),
           content_type("application/json"))
stop_for_status(r)

Но я хотел бы создать функцию, чтобы я мог делать это быстро и не копировать / вставить данные.

Проблема, с которой я сталкиваюсь, связана со строкой "a:Item URI" = "testing", где я фильтрую все поиски по URI элемента, где все они равны "testing", но иногда я не хочу включать фильтр оператор, поэтому я просто полностью удаляю эту строку.

Когда я писал свою функцию, я пробовал что-то вроде следующего:

get_localytics <- function(appID, metrics, dimensions, from = Sys.Date()-30, 
                           to = Sys.Date(), eventName = "Content Viewed",
                           Key, Secret, filterDim = NULL, filterCriteria = NULL){

  r <- httr::POST(url = "https://api.localytics.com/v1/query",
                  body = list(app_id = appID,
                              metrics = metrics,
                              dimensions = dimensions,
                              conditions = list(day = c("between", as.character(from), as.character(to)),
                                                event_name = eventName,
                                                filterDim = filterCriteria)
                              ),
                  encode="json",
                  authenticate(Key, Secret),
                  accept("application/json"),
                  content_type("application/json"))
  stop_for_status(r)
  result <- paste(rawToChar(r$content),collapse = "")  
  document <- fromJSON(result)                                      
  df <- document$results
  return(df)
}

Но моя попытка добавить filterDim и filterCriteria выдает только ошибку Unprocessable Entity. (Имейте в виду, что существует множество переменных, по которым я могу фильтровать, а не только "a:Item URI", поэтому мне нужно иметь возможность также манипулировать этим.

Как мне включить утверждение, где, если мне нужно фильтр, я могу включить эту строку, но если мне не нужно фильтровать, эта строка не включается?

1 Ответ

1 голос
/ 12 марта 2020

conditions - это просто список, поэтому вы можете условно добавлять в него элементы. Здесь мы просто используем оператор if для проверки переданных значений и, если да, добавляем их.

get_localytics <- function(appID, metrics, dimensions, from = Sys.Date()-30, 
                           to = Sys.Date(), eventName = "Content Viewed",
                           Key, Secret, filterDim = NULL, filterCriteria = NULL){

  conditions <- list(day = c("between", as.character(from), as.character(to)),
                     event_name = eventName)
  if (!is.null(filterDim)  & !is.null(filterCriteria)) {
    conditions[[filterDim]] <- filterCriteria)
  }

  r <- httr::POST(url = "https://api.localytics.com/v1/query",
                  body = list(app_id = appID,
                              metrics = metrics,
                              dimensions = dimensions,
                              conditions = conditions),
                  encode="json",
                  authenticate(Key, Secret),
                  accept("application/json"),
                  content_type("application/json"))
  stop_for_status(r)
  result <- paste(rawToChar(r$content),collapse = "")  
  document <- fromJSON(result)                                      
  df <- document$results
  return(df)
}
...