#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])
}