рдЖрд░ рдореЗрдВ рд░рд┐рдкреНрд░реЛрдбреНрдпреВрд╕рд┐рдпрд▓ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧред рдХреЛрдб рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рдЕрд▓рдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ?

рдХрд╛рдлреА рдЕрдХреНрд╕рд░ рдЖрд╡рдзрд┐рдХ рдЧрдгрдирд╛ рдФрд░ рдЖрддреНрдордирд┐рд░реНрднрд░ рдбреЗрдЯрд╛ рдкрд░ рдПрдХ рд╕рдореЗрдХрд┐рдд рд░рд┐рдкреЛрд░реНрдЯ рдХреА рддреИрдпрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрдиред рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдбреЗрдЯрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ред рдпрд╣ рдЦреБрд▓реЗ рд╕реНрд░реЛрддреЛрдВ, рд╡рд┐рднрд┐рдиреНрди рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдФрд░ рдПрдХреНрд╕реЗрд▓ рдЯреЗрдмрд▓, рдХреЙрд░реНрдкреЛрд░реЗрдЯ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рд╕реЗ рдПрдХрддреНрд░ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдХрдЪреНрдЪрд╛ рдбреЗрдЯрд╛ рдХрдИ рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдпрд╛ рдХрдИ рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рд▓реЗ рд╕рдХрддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рддрд┐рд░реВрдкрдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЗрд╕рдореЗрдВ рдЧреЛрдкрдиреАрдп рдЬрд╛рдирдХрд╛рд░реА рд╣реЛ рд╕рдХрддреА рд╣реИред рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрдм рдЧрдгрдирд╛ рдХреЛрдб рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдкрд░ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдп рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреЛрдб рдФрд░ рдбреЗрдЯрд╛ рдХреА рд╕реНрдерд┐рд░рддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЛрдб рдФрд░ рдбреЗрдЯрд╛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдПрдХреНрд╕реЗрд╕ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЕрднреА рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдХреНрдпрд╛ рдХрд░реЗрдВ?


рдпрд╣ рдкрд┐рдЫрд▓реЗ рдкреНрд░рдХрд╛рд╢рдиреЛрдВ рдХрд╛ рдПрдХ рд╕рд┐рд▓рд╕рд┐рд▓рд╛ рд╣реИ ред


RStudio рдЕрдм pinsрдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдПрдХ рдкреИрдХреЗрдЬ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдмреИрдХрдПрдВрдб рд╕рдорд╛рдзрд╛рди рд╣рдорд╛рд░реЗ рджреЗрд╢ рдХреА рд╡рд┐рд╢рд╛рд▓рддрд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрд▓реЛрдХрдкреНрд░рд┐рдп рдФрд░ рдорд╣рдВрдЧреЗ рд╣реИрдВред AWS, Azure, Google рдХреНрд▓рд╛рдЙрдб ... рд╣рд░ рдПрдХ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рднрдВрдбрд╛рд░рдг рдФрд░ рдпрд╛рддрд╛рдпрд╛рдд рдХреЗ рд▓рд┐рдПред AWS4 pinsрдЕрднреА рддрдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╛рдВрдбреЗрдХреНрд╕ рдХреНрд▓рд╛рдЙрдб рднреА рдХрд┐рдирд╛рд░реЗ рдкрд░ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдореБрдлрд╝реНрдд рдирд╣реАрдВ рд╣реИред


рджреВрд╕рд░реА рдУрд░, рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдХреЛрдВ рдХреА рдЯреАрдо рдЖрдорддреМрд░ рдкрд░ рдЫреЛрдЯреА рд╣реЛрддреА рд╣реИ (5-10 рд╕реЗ рдЕрдзрд┐рдХ рд▓реЛрдЧ рдирд╣реАрдВ)ред рдХрдИ рд▓реЛрдЧ рднреБрдЧрддрд╛рди рдпрд╛ рдореБрдлреНрдд рдкреНрд░рд╛рд░реВрдк рдореЗрдВ Google рдбреНрд░рд╛рдЗрд╡, рд╡рди рдбреНрд░рд╛рдЗрд╡ рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрд░реНрдЬрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рд▓рд╛рдн рдХреНрдпреЛрдВ рдирд╣реАрдВ рдЙрдард╛рддреЗ? рдиреАрдЪреЗ рд╕рдВрднрд╡ рд╡рд░реНрдХрдлрд╝реНрд▓реЛрдЬрд╝ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред


рд╕рдордЧреНрд░ рдпреЛрдЬрдирд╛


  1. рдЧрдгрдирд╛ рдорд╢реАрди рдкрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдорд╢реАрди рдореЗрдВ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдбреЗрдЯрд╛ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рддрд┐рдХреГрддрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
  2. рдХреЛрдб рдХреЛ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдбреЗрдЯрд╛ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЧрд┐рд░рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП (рд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рддреНрд░рд╛ рдФрд░ рдЧреЛрдкрдиреАрдпрддрд╛)ред рд╣рдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рддрд┐рдХреГрддрд┐ (рдпрд╛ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ .gitignore), рдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдПрдХ рдмрд╛рд╣рд░реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ ред
  3. рдбреЗрдЯрд╛ рдорд╛рд╕реНрдЯрд░ рдХреЛ Google рдбреНрд░рд╛рдЗрд╡ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдЗрд╕рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рд░рдЦрддреЗ рд╣реИрдВред

рдпрд╣ рдЫреЛрдЯреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдорд▓рд╛ рд╣реИред рдХреНрд▓рд╛рдЙрдб рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдиреАрдп рдбреЗрдЯрд╛ рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреА рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдФрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг Google рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдиреАрдЪреЗ рдХреЛрдб рд╣реИред


library(googledrive)
library(memoise)
#    google disk
drive_user()
updateGdCache(here::here("data/"), cloud_folder = "XXX___jZnIW3jdkbdxK0iazx7t63Dc")

рдХреИрд╢ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди
updateGdCache <- function(local_folder, cloud_folder){
  #     
  cache_fname <- "gdrive_sig.Rds"
  # 0.  memoise     
  getGdriveFolder <- memoise(function(gdrive_folder){
    drive_ls(as_id(gdrive_folder), recursive = FALSE)
  })

  # 1.        
  cloud_gdrive_sig <- purrr::possibly(getGdriveFolder, NULL)(cloud_folder)
  #          ,     
  if(is.null(cloud_gdrive_sig)) {
    message("Some Google Drive issues happened. Can't update cache")
    return()
  }
  # 2.       
  fdir <- if(fs::is_dir(local_folder)) local_folder else fs::path_dir(local_folder)

  # 3.       
  local_files <- fs::dir_ls(fdir, recurse = FALSE) %>%
    fs::path_file()

  # 4.        
  local_gdrive_sig <- purrr::possibly(readRDS, NULL, quiet = TRUE)(fs::path(fdir, cache_fname))
  if(is.null(local_gdrive_sig)){
    #    ,   ,     
    #  ,   
    local_gdrive_sig <- cloud_gdrive_sig %>%
      dplyr::filter(row_number() == -1)
  }
  #         
  local_gdrive_sig <- local_gdrive_sig %>%
    dplyr::filter(name %in% local_files)

  # 5.      ,    ,   
  #  ,       
  reconcile_tbl <- cloud_gdrive_sig %>%
    dplyr::rename(drive_resource_cloud = drive_resource) %>%
    dplyr::left_join(local_gdrive_sig, by = c("name", "id")) %>%
    tidyr::hoist(drive_resource_cloud, cloud_modified_time = "modifiedTime") %>%
    tidyr::hoist(drive_resource, local_modified_time = "modifiedTime") %>%
    # TODO:   ,       
    #       = NA
    dplyr::mutate(not_in_sync = is.na(local_modified_time) | cloud_modified_time != local_modified_time)

  # 6.    
  syncFile <- function(fpath, id){
    res <- purrr::possibly(drive_download, otherwise = NULL)(as_id(id), path = fpath, overwrite = TRUE, verbose = TRUE)
    ifelse(is.null(res), FALSE, TRUE)
  }
  #  ,        ,   
  sync_gdrive_sig <- reconcile_tbl %>%
    dplyr::filter(not_in_sync == TRUE) %>%
    dplyr::mutate(fpath = fs::path(fdir, name)) %>%
    dplyr::mutate(sync_status = purrr::map2_lgl(fpath, id, syncFile)) %>%
    dplyr::select(name, id, sync_status)

  # 7.      ,   
  #   
  cloud_gdrive_sig %>%
    #   
    dplyr::anti_join(dplyr::filter(sync_gdrive_sig, sync_status == FALSE), by = c("name", "id")) %>%
    saveRDS(fs::path(fdir, cache_fname))
}

рдкрде рдХреЗ рд░реВрдк рдореЗрдВ рдлрд╝реЛрд▓реНрдбрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ, рдЖрдк рдЗрд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдПрдбреНрд░реЗрд╕ рдмрд╛рд░ рд╕реЗ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣реЗрдЧрд╛ рднрд▓реЗ рд╣реА рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рдбреНрд░рд╛рдЗрд╡ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛ рд╣реЛред



рд╕рд░рд▓, рдХреЙрдореНрдкреИрдХреНрдЯ, рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдореБрдлреНрддред


рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдЬреЛрдбрд╝реА


  1. gargle0.4.0 рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ ред рджреЗрд╡ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдпрд╣рд╛рдБ ред
  2. RStudio рд╕рд░реНрд╡рд░ рдкрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдБ рд╣реИрдВ " RStudio рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рд╛рдзрд┐рдХреГрдд рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде # 79 {рдмрдВрдж}" , рд▓реЗрдХрд┐рди рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдпрд╣рд╛рдВ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ ред

рдкрд┐рдЫрд▓рд╛ рдкреНрд░рдХрд╛рд╢рди - "рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдФрд░ рдХреНрд░рд┐рд╕рдорд╕ рдЯреНрд░реА, рдХреНрдпрд╛ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?" ред

Source: https://habr.com/ru/post/undefined/


All Articles