Зацикливание переменных в параметрах заголовка YAML файла R Markdown и автоматический вывод PDF-файла для каждой переменной

#r #r-markdown #knitr

Вопрос:

Я подаю заявление на должность младшего аналитика данных и пришел к выводу, что буду рассылать много сопроводительных писем.

Чтобы (несколько) облегчить боль и страдания, которые это повлечет за собой, я хочу автоматизировать те части сопроводительного письма, которые подходят для автоматизации, и буду использовать R Markdown для (надеюсь) достижения этой цели.

Для целей этого вопроса предположим, что части, которые я хочу автоматизировать, — это должность, на которую подана заявка, и компания, которая хочет нанять кого-то на эту должность, для использования в заголовке сопроводительного письма.

Это шаги, которые я представляю себе мысленным взором:

  • Соберите позиции, представляющие интерес, и соответствующую компанию в электронной таблице Excel. Это дает и лист Excel с двумя столбцами с переменными позиция и компания соответственно.
  • Прочитайте файл Excel в уценку R как фрейм данных/tibble (назовем это jobs так ).
  • Определите два параметра в заголовке YAML файла .Rmd, чтобы они выглядели примерно так:
 ---
output: pdf_document
params:
 position: jobs$position[i]
 company: jobs$company[i]
---

 

Заголовок сопроводительного письма будет выглядеть примерно так:

«Заявление на должность по состоянию r params$position на r params$company »

Подводя итог: Чтобы не приходилось вручную изменять значения параметров для каждого сопроводительного письма, я хотел бы прочитать файл Excel с названиями должностей и названиями компаний, просмотреть их по параметрам в заголовке YAML, а затем вывести R Markdown в формате PDF для каждой пары должностей и компаний (и в идеале, чтобы название каждого PDF включало название должности и название компании для облегчения идентификации при отправке писем). Возможно ли это? (Примечание: название должности и название компании не обязательно должны храниться в файле Excel, именно так я их и собрал.)

Надеюсь, вышесказанное проясняет, чего я пытаюсь достичь.

Any nudges in the right direction is greatly appreciated!

EDIT (11 July 2021):

I have partly arrived at an answer to this.

The trick is to define a function that includes the rmarkdown::render function. This function can then be included in a nested for -loop to produce the desired PDF files.

Again, assuming that I want to automate the position and the company, I defined the rendering function as follows (in a script separate from the «main» .Rmd file containing the text [named «loop_test.Rmd» here]):

 render_function <- function(position, company){
  rmarkdown::render( 
    # Name of the 'main' .Rmd file
    'loop_test.Rmd',
    # What should the output PDF files be called?
    output_file = paste0(position, '-', company, '.pdf'),
    # Define the parameters that are used in the 'main' .Rmd file
    params = list(position = position, company = company),
    evir = parent.frame()
  )
}
 

Затем используйте функцию в for цикле a:

 for (position in positions$position) {
  for (company in positions$company) {
    render_function(position, company)
  }
}
 

Где файл Excel, содержащий соответствующие позиции, вызывается positions с помощью двух переменных, называемых position и company .

Я протестировал этот метод, используя 3 «наблюдения» для должности и компании соответственно («Компания 1», «Компания 2» и «Компания 3» и «Позиция 1», «Позиция 2» и «Позиция 3»). Одна из проблем с вышеуказанным методом заключается в том, что он создает 3^2 = 9 отчетов. Например, позиция 1 используется в письмах для Компании 1, Компании 2 и Компании 3. Очевидно, я хочу сопоставить результаты только для компании 1 и позиции 1. У кого-нибудь есть какие-либо идеи о том, как этого добиться? Это совершенно непроблематично для двух переменных с тремя наблюдениями, но я намерен использовать несколько дополнительных параметров. Количество компаний (т. е. «наблюдений»), к сожалению, также, скорее всего, будет довольно большим, прежде чем я смогу завершить свой поиск… При, скажем, 5-6 параметрах и 20 компаниях количество выводимых отчетов, очевидно, станет смехотворным.

Как уже было сказано, я почти на месте, но любые подсказки в правильном направлении о том, как ограничить выпуск только «соответствием» компании занимаемой должности, будут высоко оценены.

Ответ №1:

Вы можете перебирать по строкам, как показано ниже.

 for(i in 1:nrow(positions)) {
  render_function(positions$position[i], positions$company[i])
}