inst/doc/fitbit_viz.R

## ----setup, echo = FALSE------------------------------------------------------

#.................................................
# REFERENCES for cache:
#
#      - https://yihui.org/knitr/demo/cache/
#      - https://yihui.org/knitr/options/#cache
#      - https://stackoverflow.com/a/52163751
#      - https://github.com/yihui/knitr/issues/994
#      - https://stackoverflow.com/a/10629121
#.................................................


build_vignette_with_user_id_token = FALSE

if (build_vignette_with_user_id_token) {
  
  knitr::opts_chunk$set(fig.width = 12,
                        fig.height = 10, 
                        fig.align = "center",
                        warning = FALSE, 
                        message = FALSE,
                        eval = TRUE,
                        echo = TRUE, 
                        cache = TRUE,
                        cache.rebuild = TRUE)    # for 'cache.rebuild' see the references
  
  USER_ID = 'use the true user-id here'
  token = 'use the true token here'
}

if (!build_vignette_with_user_id_token) {
  
  knitr::opts_chunk$set(fig.width = 12,
                        fig.height = 10, 
                        fig.align = "center",
                        warning = FALSE, 
                        message = FALSE)
  
  file_heart = system.file('tests_vignette_rds', 'heart_dat.RDS', package = 'fitbitViz')
  file_sleep = system.file('tests_vignette_rds', 'sleep_ts.RDS', package = 'fitbitViz')
  file_tcx = system.file('tests_vignette_rds', 'res_tcx.RDS', package = 'fitbitViz')
  file_rst = system.file('tests_vignette_rds', 'raysh_rst.tif', package = 'fitbitViz')
  
  heart_dat = readRDS(file = file_heart)
  sleep_ts = readRDS(file = file_sleep)
  res_tcx = readRDS(file = file_tcx)
  raysh_rst = raster::raster(x = file_rst)
}


## ---- eval = FALSE------------------------------------------------------------
#  
#  require(fitbitViz)
#  
#  #..................
#  # parameter setting
#  #..................
#  
#  USER_ID = 'My user-id'             # Specify here your 'user-id'
#  token = "My token"                 # Specify here your 'token'
#  

## ---- eval = FALSE------------------------------------------------------------
#  
#  #..............................................
#  # Refresh token once it expires (after 8 hours)
#  #..............................................
#  
#  client_id = 'xxxxxx'
#  client_secret = 'xxxxxxxxxxxxxxxxxx'
#  refresh_token = 'xxxxxxxxxxxxxxxxxxxxxxxx'
#  
#  # refresh the token
#  new_token = refresh_token_app(client_id = client_id,
#                                client_secret = client_secret,
#                                refresh_token = refresh_token)
#  
#  # a named list that includes the new 'access_token' and 'refresh_token'
#  str(new_token)
#  

## -----------------------------------------------------------------------------

WEEK = 11                         # for this use case pick the 11th week of the year 2021

num_character_error = 135         # print that many character in case of an error

weeks_2021 = fitbitViz:::split_year_in_weeks(year = 2021)         # split a year in weeks

# Start the week at monday (see: https://github.com/tidyverse/lubridate/issues/509)
date_start = lubridate::floor_date(lubridate::ymd(weeks_2021[WEEK]), unit = 'weeks') + 1  

# Add 6 days to the 'date_start' variable to come to a 7-days plot
date_end = date_start + 6

sleep_time_begins = "00H 40M 0S"
sleep_time_ends = "08H 00M 0S"

VERBOSE = FALSE                       # disable verbosity


## ---- echo = TRUE, out.height = '1000px', eval = FALSE------------------------
#  
#  #.......................
#  # heart rate time series
#  #.......................
#  
#  heart_dat = fitbitViz::heart_rate_time_series(user_id = USER_ID,
#                                                token = token,
#                                                date_start = as.character(date_start),
#                                                date_end = as.character(date_end),
#                                                time_start = '00:00',
#                                                time_end = '23:59',
#                                                detail_level = '1min',
#                                                ggplot_intraday = TRUE,
#                                                ggplot_ncol = 2,
#                                                ggplot_nrow = 4,
#                                                verbose = VERBOSE,
#                                                show_nchar_case_error = num_character_error)
#  heart_dat$plt
#  

## ---- echo = FALSE------------------------------------------------------------

#...............................................
# DT::datatable() as option to download the data  [ heart rate time series ]
#...............................................

dt_heart_rate_data = data.table::rbindlist(heart_dat$heart_rate_intraday)

dt_heart_rate = DT::datatable(data = dt_heart_rate_data,
                              rownames = FALSE,
                              extensions = 'Buttons',
                              options = list(pageLength = 10,
                                             dom = 'Bfrtip',
                                             buttons = list(list(extend = 'csv',
                                                                 filename = 'heart_rate_time_series'))))
dt_heart_rate


## ---- echo = TRUE, out.height = '1000px', eval = FALSE------------------------
#  
#  #............................
#  # heart rate intraday heatmap [ plot options: https://yihui.org/knitr/options/#plots ]
#  #............................
#  
#  heart_intra = heart_dat$heart_rate_intraday
#  
#  hrt_heat = fitbitViz::heart_rate_heatmap(heart_rate_intraday_data = heart_intra,
#                                           angle_x_axis = 0)
#  hrt_heat
#  

## ---- echo = TRUE, eval = FALSE-----------------------------------------------
#  
#  #.......................
#  # heart rate variability
#  #.......................
#  
#  hrt_rt_var = fitbitViz::fitbit_data_type_by_date(user_id = USER_ID,
#                                                   token = token,
#                                                   date = as.character(date_start),
#                                                   type = 'hrv',
#                                                   plot = TRUE,
#                                                   show_nchar_case_error = num_character_error)
#  

## ---- echo = TRUE, out.height = '1000px', eval = FALSE------------------------
#  
#  #.......................
#  # sleep data time series
#  #.......................
#  
#  sleep_ts = fitbitViz::sleep_time_series(user_id = USER_ID,
#                                          token = token,
#                                          date_start = as.character(date_start),
#                                          date_end = as.character(date_end),
#                                          ggplot_color_palette = 'ggsci::blue_material',
#                                          ggplot_ncol = 2,
#                                          ggplot_nrow = 4,
#                                          show_nchar_case_error = num_character_error,
#                                          verbose = VERBOSE)
#  sleep_ts$plt_lev_segments
#  

## ---- echo = FALSE------------------------------------------------------------

#.....................................
# DT::datatable() of the sleep heatmap
#.....................................

dt_sleep_heatmap = DT::datatable(data = sleep_ts$heatmap_data,
                                 rownames = FALSE,
                                 extensions = 'Buttons',
                                 options = list(pageLength = 10,
                                                dom = 'Bfrtip',
                                                buttons = list(list(extend = 'csv',
                                                                    filename = 'sleep_heat_map'))))

dt_sleep_heatmap


## ---- echo = TRUE, eval = FALSE-----------------------------------------------
#  
#  #...................
#  # extract the log-id (required for the GPS data)
#  #...................
#  
#  log_id = fitbitViz::extract_LOG_ID(user_id = USER_ID,
#                                     token = token,
#                                     after_Date = as.character(date_start),
#                                     limit = 10,
#                                     sort = 'asc',
#                                     verbose = VERBOSE)
#  # log_id
#  

## ---- echo = TRUE, eval = FALSE-----------------------------------------------
#  
#  #....................................................
#  # return the gps-ctx data.table for the output log-id
#  #....................................................
#  
#  res_tcx = fitbitViz::GPS_TCX_data(log_id = log_id,
#                                    user_id = USER_ID,
#                                    token = token,
#                                    time_zone = 'Europe/Athens',
#                                    verbose = VERBOSE)
#  # res_tcx
#  

## ---- echo = TRUE-------------------------------------------------------------

#................................
# Create the Leaflet / LeafGL Map
#................................

res_lft = fitbitViz::leafGL_point_coords(dat_gps_tcx = res_tcx,
                                         color_points_column = 'AltitudeMeters',
                                         provider = leaflet::providers$Esri.WorldImagery,
                                         option_viewer = rstudioapi::viewer,
                                         CRS = 4326)

## ---- echo = TRUE-------------------------------------------------------------

res_lft


## ---- echo = FALSE------------------------------------------------------------

#.................................
# DT::datatable() for the GPS data
#.................................

dt_gps_tcx = DT::datatable(data = res_tcx,
                           rownames = FALSE,
                           extensions = 'Buttons',
                           class = 'white-space: nowrap',                 # unwrap the column-contents so that rows become flat, see:  https://github.com/rstudio/DT/issues/353
                           options = list(pageLength = 10,
                                          dom = 'Bfrtip',
                                          buttons = list(list(extend = 'csv',
                                                              filename = 'GPS_TCX_data'))))

dt_gps_tcx


## ---- echo = FALSE, eval = FALSE----------------------------------------------
#  
#  # reference for the st_buffer function:  https://stackoverflow.com/a/54754935
#  

## ---- echo = TRUE-------------------------------------------------------------

#...................................................
# compute the sf-object buffer and the raster-extend  (1000 meters buffer)
#...................................................

sf_rst_ext = fitbitViz::extend_AOI_buffer(dat_gps_tcx = res_tcx,
                                          buffer_in_meters = 1000,
                                          CRS = 4326,
                                          verbose = VERBOSE)
# sf_rst_ext


## ---- echo = TRUE, eval = FALSE-----------------------------------------------
#  
#  #..................................................................
#  # Download the Copernicus DEM 30m elevation data
#  # there is also the option to download the DEM 90m elevation data
#  # which is of lower resolution but the image size is smaller which
#  # means faster download
#  #..................................................................
#  
#  dem_dir = tempdir()
#  # dem_dir
#  
#  dem30 = CopernicusDEM::aoi_geom_save_tif_matches(sf_or_file = sf_rst_ext$sfc_obj,
#                                                   dir_save_tifs = dem_dir,
#                                                   resolution = 30,
#                                                   crs_value = 4326,
#                                                   threads = parallel::detectCores(),
#                                                   verbose = VERBOSE)
#  
#  TIF = list.files(dem_dir, pattern = '.tif', full.names = T)
#  # TIF
#  
#  if (length(TIF) > 1) {
#  
#    #....................................................
#    # create a .VRT file if I have more than 1 .tif files
#    #....................................................
#  
#    file_out = file.path(dem_dir, 'VRT_mosaic_FILE.vrt')
#  
#    vrt_dem30 = CopernicusDEM::create_VRT_from_dir(dir_tifs = dem_dir,
#                                                   output_path_VRT = file_out,
#                                                   verbose = VERBOSE)
#  }
#  
#  if (length(TIF) == 1) {
#  
#    #..................................................
#    # if I have a single .tif file keep the first index
#    #..................................................
#  
#    file_out = TIF[1]
#  }
#  
#  #.......................................
#  # crop the elevation DEM based on the
#  # coordinates extent of the GPS-CTX data
#  #.......................................
#  
#  raysh_rst = fitbitViz::crop_DEM(tif_or_vrt_dem_file = file_out,
#                                  sf_buffer_obj = sf_rst_ext$sfc_obj,
#                                  verbose = VERBOSE)
#  # terra::plot(raysh_rst)
#  

## ---- echo = TRUE-------------------------------------------------------------

linestring_dat = fitbitViz::gps_lat_lon_to_LINESTRING(dat_gps_tcx = res_tcx,
                                                      CRS = 4326,
                                                      time_split_asc_desc = NULL,
                                                      verbose = VERBOSE)


## ---- echo = TRUE-------------------------------------------------------------

idx_3m = c(which.min(res_tcx$AltitudeMeters), 
           as.integer(length(res_tcx$AltitudeMeters) / 2), 
           which.max(res_tcx$AltitudeMeters))

cols_3m = c('latitude', 'longitude', 'AltitudeMeters')
dat_3m = res_tcx[idx_3m, ..cols_3m]


## ---- echo = TRUE, eval = FALSE-----------------------------------------------
#  
#  #.....................................................
#  # Conversion of the 'SpatRaster' to a raster object
#  # because the 'rayshader' package accepts only rasters
#  #.....................................................
#  
#  rst_obj = raster::raster(raysh_rst)
#  raster::projection(rst_obj) <- terra::crs(raysh_rst, proj = TRUE)
#  
#  
#  snapshot_rayshader_path = file.path(tempdir(), 'rayshader_img.png')
#  
#  rgl::open3d(useNULL = TRUE)                       # this removes the second rgl-popup-window
#  
#  fitbitViz::rayshader_3d_DEM(rst_buf = rst_obj,
#                              rst_ext = sf_rst_ext$raster_obj_extent,
#                              linestring_ASC_DESC = linestring_dat,
#                              elevation_sample_points = dat_3m,
#                              zoom = 0.3,
#                              windowsize = c(1000, 800),
#                              add_shadow_rescale_original = FALSE,
#                              verbose = TRUE)
#  
#  rgl::rgl.snapshot(snapshot_rayshader_path)
#  rgl::par3d(mouseMode = "trackball")   # options: c("trackball", "polar", "zoom", "selecting")
#  rgl::rglwidget()
#  

Try the fitbitViz package in your browser

Any scripts or data that you put into this service are public.

fitbitViz documentation built on Jan. 6, 2023, 5:28 p.m.