Как написать несколько файлов docx в стиле purrr::map() с помощью Officer из downloadHandler() в каталоге Shiny to temp?

Я пытаюсь написать несколько файлов docx из downloadHandler(). Когда purrr::map() достигает той части отображаемой функции, где резюме записывается с уникальным именем в указанный временный каталог, затем оно сжимается и возвращается в аргумент file функции downloadHandler(). Ошибка о том, что указанный каталог не существует. Пример каталога для одного резюме: /var/folders/vv/57k257g531b889lqwcgj2z3m0000gp/T//RtmpqhDbg1/resumes/someones_name_resume.docx.

Я пробовал много способов записи файлов в разные места или изменения конечного каталога. Я работаю из проекта R. Я продолжаю получать сообщение об ошибке: «Предупреждение: ошибка в: каталог /var/folders/vv/57k257g531b889lqwcgj2z3m0000gp/T//RtmpqhDbg1/resumes/someones_name_resume.docx не существует».

resume_temp <- file.path(tempdir(), "resumes")
make_my_resume <- function(my_id) {


  # the empty Word doc that has an applied resume style
  template <- read_docx(here::here("r_scripts", "modern_basic_resume_empty.docx"))


  name_for_file <- str_to_lower(paste(my$first_name, my$last_name, sep = "_"))


  #-----------------------build resume in Word------------------------------------

  word_resume <- template %>%
    cursor_begin() %>% 
    body_remove() %>%
    body_add_par(paste(my$first_name, my$last_name), style = "Title") %>%

    body_end_section_continuous() %>%
    body_add_par(my$address, style = "Contact Info") %>%
    body_add_par(my$phone, style = "Contact Info") %>%
    body_add_par(my$email, style = "Contact Info") %>%

    body_end_section_continuous() %>%
    body_add_par(" ", style = "Title") %>%
    body_add_par(" ", style = "Normal") %>%

    body_end_section_continuous() %>%
    body_add_par("Experience", style = "heading 1") %>%
    body_add_table(my_experience, style = "Plain Table 5") %>%

    body_end_section_continuous() %>%
    body_add_par("Deployments", style = "heading 1") %>%
    body_add_table(my_deployments, style = "Plain Table 5") %>%

    body_end_section_continuous() %>%
    body_add_par("Education", style = "heading 1") %>%
    body_add_table(my_education, style = "Plain Table 5") %>%

    body_end_section_continuous() %>%
    body_add_par("Certifications", style = "heading 1") %>%
    body_end_section_continuous()

  # iterate over each certification
  for (cert in my_certificates$certs) {
    eval(parse(text = (paste0("word_resume <- body_add_par(word_resume, ",
                              "'", cert, "'",
                              ", ",
                              "style = 'List Bullet')",
                              collapse = ""))))
  }

  word_resume <- word_resume %>%  
    body_end_section_columns() %>%
    body_add_par("SKILLS", style = "heading 1") %>%
    body_end_section_continuous()

  # iterate over each skill
  for (skill in my_skills$skills) {
    eval(parse(text = (paste0("word_resume <- body_add_par(word_resume, ",
                              "'", skill, "'",
                              ", ",
                              "style = 'List Bullet')",
                              collapse = ""))))
  }

  message("------starting to write resumes to file------")
  # finish and write to disk

  # browser()

  # resume_empty_dir <- paste0(resume_temp, "/", name_for_file, "_resume.docx")
  # 
  # write_file()

  word_resume <- word_resume %>%  
    body_end_section_columns() %>% 
    print(target = file.path(resume_temp, paste0(name_for_file, "_resume.docx")))


}
output$resume <- downloadHandler(

    filename = "resumes.zip",
    content = function(file, resume_temp) {

      # resume_temp <- here::here(tempdir(), "resumes")

      # file <- NULL

      message("----starting map2()----")

      # browser()

      require(purrr)
      purrr::map(
        .x = selectedId(),  # reactive list for my_id argument in         # make_my_resume
        .f = make_my_resume
      )

      message("----map2() finished----")

      zip::zipr(zipfile = file, files = resume_temp)
      message("----files zipped----")

    },
    contentType = "application/zip"
  )

Я хочу, чтобы резюме записывались во временный каталог, который был заархивирован и возвращен в файловый аргумент downloadHandler(). Большое спасибо!


person Travis Knoche    schedule 14.05.2019    source источник


Ответы (1)


Я нашел решение. Вместо того, чтобы создавать мой tempdir (вне приложения) для записи как

temp_path <- file.path(tempdir(), "sub_directory")

Я создал его как раз

temp_path <- file.path(tempdir())

После того, как файлы docx были записаны в temp_path, я использовал комбинацию list.files() и regex, чтобы заархивировать и вернуть только те файлы, которые мне нужны, поскольку вместе с файлами docx создаются некоторые другие нежелательные каталоги. Я использовал следующее внутри функции содержимого downloadHandler() после того, как purr:map() записал файлы docx в мой временный каталог:

to_keep <- list.files(temp_path, pattern = ".docx$", full.names = TRUE)

all_temp_files <- list.files(temp_path, full.names = TRUE)

to_remove <- setdiff(all_temp_files, to_keep)

unlink(to_remove, recursive = TRUE, force = TRUE)

zip::zipr(zipfile = file, files = temp_path)

Я до сих пор не знаю, почему

temp_path <- file.path(tempdir(), "sub_directory")

хотя не работает.

person Travis Knoche    schedule 15.05.2019