рдХрд╛рдлреА рдЕрдХреНрд╕рд░ рдЖрд╡рдзрд┐рдХ рдЧрдгрдирд╛ рдФрд░ рдЖрддреНрдордирд┐рд░реНрднрд░ рдбреЗрдЯрд╛ рдкрд░ рдПрдХ рд╕рдореЗрдХрд┐рдд рд░рд┐рдкреЛрд░реНрдЯ рдХреА рддреИрдпрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрдиред рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдбреЗрдЯрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ред рдпрд╣ рдЦреБрд▓реЗ рд╕реНрд░реЛрддреЛрдВ, рд╡рд┐рднрд┐рдиреНрди рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдФрд░ рдПрдХреНрд╕реЗрд▓ рдЯреЗрдмрд▓, рдХреЙрд░реНрдкреЛрд░реЗрдЯ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рд╕реЗ рдПрдХрддреНрд░ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдХрдЪреНрдЪрд╛ рдбреЗрдЯрд╛ рдХрдИ рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдпрд╛ рдХрдИ рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рд▓реЗ рд╕рдХрддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рддрд┐рд░реВрдкрдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЗрд╕рдореЗрдВ рдЧреЛрдкрдиреАрдп рдЬрд╛рдирдХрд╛рд░реА рд╣реЛ рд╕рдХрддреА рд╣реИред рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрдм рдЧрдгрдирд╛ рдХреЛрдб рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдкрд░ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдп рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреЛрдб рдФрд░ рдбреЗрдЯрд╛ рдХреА рд╕реНрдерд┐рд░рддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЛрдб рдФрд░ рдбреЗрдЯрд╛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдПрдХреНрд╕реЗрд╕ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЕрднреА рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдХреНрдпрд╛ рдХрд░реЗрдВ?
рдпрд╣ рдкрд┐рдЫрд▓реЗ рдкреНрд░рдХрд╛рд╢рдиреЛрдВ рдХрд╛ рдПрдХ рд╕рд┐рд▓рд╕рд┐рд▓рд╛ рд╣реИ ред
RStudio рдЕрдм pins
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдПрдХ рдкреИрдХреЗрдЬ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдмреИрдХрдПрдВрдб рд╕рдорд╛рдзрд╛рди рд╣рдорд╛рд░реЗ рджреЗрд╢ рдХреА рд╡рд┐рд╢рд╛рд▓рддрд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрд▓реЛрдХрдкреНрд░рд┐рдп рдФрд░ рдорд╣рдВрдЧреЗ рд╣реИрдВред AWS, Azure, Google рдХреНрд▓рд╛рдЙрдб ... рд╣рд░ рдПрдХ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рднрдВрдбрд╛рд░рдг рдФрд░ рдпрд╛рддрд╛рдпрд╛рдд рдХреЗ рд▓рд┐рдПред AWS4 pins
рдЕрднреА рддрдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╛рдВрдбреЗрдХреНрд╕ рдХреНрд▓рд╛рдЙрдб рднреА рдХрд┐рдирд╛рд░реЗ рдкрд░ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдореБрдлрд╝реНрдд рдирд╣реАрдВ рд╣реИред
рджреВрд╕рд░реА рдУрд░, рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдХреЛрдВ рдХреА рдЯреАрдо рдЖрдорддреМрд░ рдкрд░ рдЫреЛрдЯреА рд╣реЛрддреА рд╣реИ (5-10 рд╕реЗ рдЕрдзрд┐рдХ рд▓реЛрдЧ рдирд╣реАрдВ)ред рдХрдИ рд▓реЛрдЧ рднреБрдЧрддрд╛рди рдпрд╛ рдореБрдлреНрдд рдкреНрд░рд╛рд░реВрдк рдореЗрдВ Google рдбреНрд░рд╛рдЗрд╡, рд╡рди рдбреНрд░рд╛рдЗрд╡ рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрд░реНрдЬрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рд▓рд╛рдн рдХреНрдпреЛрдВ рдирд╣реАрдВ рдЙрдард╛рддреЗ? рдиреАрдЪреЗ рд╕рдВрднрд╡ рд╡рд░реНрдХрдлрд╝реНрд▓реЛрдЬрд╝ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред
рд╕рдордЧреНрд░ рдпреЛрдЬрдирд╛
- рдЧрдгрдирд╛ рдорд╢реАрди рдкрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдорд╢реАрди рдореЗрдВ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдбреЗрдЯрд╛ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рддрд┐рдХреГрддрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
- рдХреЛрдб рдХреЛ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдбреЗрдЯрд╛ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЧрд┐рд░рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП (рд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рддреНрд░рд╛ рдФрд░ рдЧреЛрдкрдиреАрдпрддрд╛)ред рд╣рдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рддрд┐рдХреГрддрд┐ (рдпрд╛ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ
.gitignore
), рдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдПрдХ рдмрд╛рд╣рд░реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ ред - рдбреЗрдЯрд╛ рдорд╛рд╕реНрдЯрд░ рдХреЛ Google рдбреНрд░рд╛рдЗрд╡ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдЗрд╕рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рд░рдЦрддреЗ рд╣реИрдВред
рдпрд╣ рдЫреЛрдЯреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдорд▓рд╛ рд╣реИред рдХреНрд▓рд╛рдЙрдб рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдиреАрдп рдбреЗрдЯрд╛ рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреА рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдФрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг Google рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдиреАрдЪреЗ рдХреЛрдб рд╣реИред
library(googledrive)
library(memoise)
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))
}
рдкрде рдХреЗ рд░реВрдк рдореЗрдВ рдлрд╝реЛрд▓реНрдбрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ, рдЖрдк рдЗрд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдПрдбреНрд░реЗрд╕ рдмрд╛рд░ рд╕реЗ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣реЗрдЧрд╛ рднрд▓реЗ рд╣реА рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рдбреНрд░рд╛рдЗрд╡ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛ рд╣реЛред

рд╕рд░рд▓, рдХреЙрдореНрдкреИрдХреНрдЯ, рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдореБрдлреНрддред
рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдЬреЛрдбрд╝реА
gargle
0.4.0 рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ ред рджреЗрд╡ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдпрд╣рд╛рдБ ред- RStudio рд╕рд░реНрд╡рд░ рдкрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдБ рд╣реИрдВ " RStudio рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рд╛рдзрд┐рдХреГрдд рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде # 79 {рдмрдВрдж}" , рд▓реЗрдХрд┐рди рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдпрд╣рд╛рдВ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ ред
рдкрд┐рдЫрд▓рд╛ рдкреНрд░рдХрд╛рд╢рди - "рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдФрд░ рдХреНрд░рд┐рд╕рдорд╕ рдЯреНрд░реА, рдХреНрдпрд╛ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?" ред