2021-03-02 23:57:22 +01:00
# if you need a new package, you should add it with renv::install(package) so your renv venv is updated
library ( RMariaDB )
2021-03-07 05:19:32 +01:00
library ( yaml )
#' @description
#' Auxiliary function to parse the connection credentials from a specifc group in ./credentials.yaml
#' You can reause most of this function if you are connection to a DB or Web API.
#' It's OK to delete this function if you don't need credentials, e.g., you are pulling data from a CSV for example.
#' @param group the yaml key containing the credentials to connect to a database
#' @preturn dbEngine a database engine (connection) ready to perform queries
get_db_engine <- function ( group ) {
# The working dir is aways RAPIDS root folder, so your credentials file is always /credentials.yaml
credentials <- read_yaml ( " ./credentials.yaml" )
if ( ! group %in% names ( credentials ) )
stop ( paste ( " The credentials group" , group , " does not exist in ./credentials.yaml. The only groups that exist in that file are:" , paste ( names ( credentials ) , collapse = " ," ) ) )
dbEngine <- dbConnect ( MariaDB ( ) , db = credentials [ [group ] ] [ [ " database" ] ] ,
username = credentials [ [group ] ] [ [ " user" ] ] ,
password = credentials [ [group ] ] [ [ " password" ] ] ,
host = credentials [ [group ] ] [ [ " host" ] ] ,
port = credentials [ [group ] ] [ [ " port" ] ] )
return ( dbEngine )
}
2021-03-02 23:57:22 +01:00
# This file gets executed for each PHONE_SENSOR of each participant
# If you are connecting to a database the env file containing its credentials is available at "./.env"
# If you are reading a CSV file instead of a DB table, the @param sensor_container wil contain the file path as set in config.yaml
# You are not bound to databases or files, you can query a web API or whatever data source you need.
#' @description
#' RAPIDS allows users to use the keyword "infer" (previously "multiple") to automatically infer the mobile Operative System a device was running.
#' If you have a way to infer the OS of a device ID, implement this function. For example, for AWARE data we use the "aware_device" table.
#'
#' If you don't have a way to infer the OS, call stop("Error Message") so other users know they can't use "infer" or the inference failed,
#' and they have to assign the OS manually in the participant file
#'
2021-03-08 21:58:26 +01:00
#' @param stream_parameters The PHONE_STREAM_PARAMETERS key in config.yaml. If you need specific parameters add them there.
2021-03-02 23:57:22 +01:00
#' @param device A device ID string
#' @return The OS the device ran, "android" or "ios"
2021-03-08 21:58:26 +01:00
infer_device_os <- function ( stream_parameters , device ) {
dbEngine <- get_db_engine ( stream_parameters $ DATABASE_GROUP )
2021-03-02 23:57:22 +01:00
query <- paste0 ( " SELECT device_id,brand FROM aware_device WHERE device_id = '" , device , " '" )
message ( paste0 ( " Executing the following query to infer phone OS: " , query ) )
os <- dbGetQuery ( dbEngine , query )
dbDisconnect ( dbEngine )
if ( nrow ( os ) > 0 )
return ( os %>% mutate ( os = ifelse ( brand == " iPhone" , " ios" , " android" ) ) %>% pull ( os ) )
else
stop ( paste ( " We cannot infer the OS of the following device id because it does not exist in the aware_device table:" , device ) )
return ( os )
}
#' @description
#' Gets the sensor data for a specific device id from a database table, file or whatever source you want to query
#'
2021-03-08 21:58:26 +01:00
#' @param stream_parameters The PHONE_STREAM_PARAMETERS key in config.yaml. If you need specific parameters add them there.
2021-03-02 23:57:22 +01:00
#' @param device A device ID string
2021-03-13 00:14:49 +01:00
#' @param sensor_container database table or file containing the sensor data for all participants. This is the PHONE_SENSOR[CONTAINER] key in config.yaml
2021-03-02 23:57:22 +01:00
#' @param columns the columns needed from this sensor (we recommend to only return these columns instead of every column in sensor_container)
#' @return A dataframe with the sensor data for device
2021-03-09 22:42:02 +01:00
pull_data <- function ( stream_parameters , device , sensor , sensor_container , columns ) {
2021-03-08 21:58:26 +01:00
dbEngine <- get_db_engine ( stream_parameters $ DATABASE_GROUP )
2021-03-09 22:42:02 +01:00
query <- paste0 ( " SELECT " , paste ( columns , collapse = " ," ) , " FROM " , sensor_container , " WHERE " , columns $ DEVICE_ID , " = '" , device , " '" )
2021-03-02 23:57:22 +01:00
# Letting the user know what we are doing
message ( paste0 ( " Executing the following query to download data: " , query ) )
sensor_data <- dbGetQuery ( dbEngine , query )
dbDisconnect ( dbEngine )
if ( nrow ( sensor_data ) == 0 )
warning ( paste ( " The device '" , device , " ' did not have data in " , sensor_container ) )
return ( sensor_data )
}