استنساخ الحوسبة في R. كيفية فصل التعليمات البرمجية والبيانات؟

غالبًا ما تكون هناك حاجة لإجراء حسابات دورية وإعداد تقرير موحد حول بيانات الاكتفاء الذاتي. أولئك. وفقًا للبيانات المخزنة كملفات. يمكن أن تكون هذه البيانات التي تم جمعها من مصادر مفتوحة ، ومستندات متنوعة وجداول إكسل ، وتنزيلات من أنظمة الشركة. يمكن أن تستغرق البيانات الأولية عدة ميجابايت أو عدة جيجابايت. قد تكون البيانات غير شخصية أو تحتوي على معلومات سرية. في الحالة التي يتم فيها وضع كود الحساب في المستودع ، ويتم تنفيذ العمل من قبل أكثر من شخص واحد على أكثر من جهاز كمبيوتر واحد ، تنشأ المشكلة في الحفاظ على تناسق التعليمات البرمجية والبيانات. في الوقت نفسه ، لا يزال من الضروري ضمان الامتثال لحقوق الوصول المختلفة إلى التعليمات البرمجية والبيانات. ماذا أفعل؟


إنه استمرار للمنشورات السابقة .


تعمل RStudio الآن بنشاط على تطوير حزمة pinsلحل هذه المشكلة. لسوء الحظ ، فإن الحلول الخلفية المستخدمة غير شعبية إلى حد ما ومكلفة للاستخدام في مساحة بلدنا. AWS و Azure و Google cloud ... لكل واحد يجب عليك دفعه مقابل التخزين وحركة المرور. pinsلا يدعم AWS4 المصادقة حتى الآن ، لذا فإن Yandex cloud موجودة أيضًا على الهامش ، على الرغم من أنها ليست مجانية.


من ناحية أخرى ، عادة ما تكون فرق المحللين الذين يعملون في مهام محددة صغيرة (لا تزيد عن 5-10 أشخاص). يستخدم الكثيرون محرك جوجل ، محرك واحد ، وما إلى ذلك ، في شكل مدفوع أو مجاني. لماذا لا تستفيد من الموارد المكتسبة بالفعل؟ فيما يلي أحد سير العمل المحتمل.


خطة شاملة


  1. يجب إجراء الحسابات محليًا على الجهاز ، مما يعني أنه يجب أن يكون للجهاز نسخة متماثلة فعلية لجميع البيانات اللازمة للحسابات.
  2. يجب أن يكون الرمز تحت التحكم في الإصدار. يجب ألا تقع البيانات فيه بأي شكل من الأشكال (الحجم المحتمل والسرية). سنقوم بتخزين النسخة المتماثلة للبيانات إما في مجلد منفصل في المشروع (بما في ذلك في .gitignore) ، أو في دليل خارجي متعلق بالمشروع.
  3. سيتم تخزين البيانات الرئيسية بواسطة محرك جوجل. نضع حقوق الوصول إلى الدلائل فيه.

يبقى الحال بالنسبة للصغار. من الضروري تنفيذ وظيفة المزامنة للنسخة المتماثلة من البيانات المحلية مع السحابة. يتم توفير المصادقة والمصادقة من قبل جوجل.


أدناه هو الرمز.


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. هناك مشاكل في ترميز gargleالإصدار 0.4.0. من الضروري تحميل نسخة ديف. مزيد من التفاصيل هنا .
  2. توجد مشاكل في التفويض على خادم RStudio "تعذر التفويض من خادم RStudio # 79 {مغلق}" ، ولكن يمكن العثور على أفكار للمشكلة هنا .

المنشور السابق - "البرمجة وشجرة عيد الميلاد ، هل يمكن الجمع بينهما؟" .

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


All Articles