【问题标题】:Looping variables in the parameters of the YAML header of an R Markdown file and automatically outputting a PDF for each variable在 R Markdown 文件的 YAML 标头的参数中循环变量并为每个变量自动输出 PDF
【发布时间】:2021-09-19 12:15:21
【问题描述】:

我正在申请初级数据分析师职位,并意识到我将发送很多封求职信。

为了(在某种程度上)减轻这将带来的痛苦和痛苦,我想自动化求职信中适合自动化的部分,并将使用 R Markdown 来(希望)实现这一目标。

就这个问题而言,假设我希望自动化的部分是申请的职位,而公司希望雇用某人担任该职位,用于求职信的标题。

这些是我在脑海中设想的步骤:

  • 在 Excel 电子表格中收集感兴趣的职位和相应的公司。这给出了一个 Excel 表格,其中包含两列变量,分别为 positioncompany
  • 将 Excel 文件作为数据框/tibble 读入 R Markdown(我们称之为jobs)。
  • 在 .Rmd 文件的 YAML 标头中定义两个参数,如下所示:
---
output: pdf_document
params:
 position: jobs$position[i]
 company: jobs$company[i]
---

求职信的标题将如下所示:

r params$positionr params$company职位申请

总结一下:为了不必手动更改每封求职信的参数值,我想读取一个带有职位标题和公司名称的 Excel 文件,通过 YAML 标头中的参数循环这些文件,然后让 R Markdown 为每对职位和公司输出一个 PDF(理想情况下,每个 PDF 的名称都包括职位名称和公司名称,以便在发送信件时更容易识别)。那可能吗? (注:职位名称和公司名称不一定要保存在 Excel 文件中,我就是这样收集的。)

希望以上内容清楚地说明了我想要实现的目标。

非常感谢任何朝着正确方向的推动!

编辑(2021 年 7 月 11 日):

我已经部分找到了这个问题的答案。

诀窍是定义一个包含rmarkdown::render 函数的函数。然后可以将此函数包含在嵌套的for-loop 中以生成所需的 PDF 文件。

再次,假设我想自动化 positioncompany,我将渲染函数定义如下(在与“main”.Rmd 分开的脚本中包含文本的文件[此处命名为“loop_test.Rmd”]):

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-loop 中使用该函数:

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

其中包含相关位置的 Excel 文件称为 positions,其中有两个变量称为 positioncompany

我分别对一个职位和一个公司使用 3 个“观察”(“公司 1”、“公司 2”和“公司 3”和“职位 1”、“职位 2”和“职位 3”)测试了这种方法)。上述方法的一个问题是它会生成 3^2 = 9 个报告。例如,职位 1 用于公司 1、公司 2 和公司 3 的字母。我显然只想匹配公司 1 和职位 1 的输出。有人知道如何实现这一点吗?这对于只有三个观察值的两个变量来说是完全没有问题的,但我的意图是使用几个额外的参数。不幸的是,在我结束搜索之前,公司的数量(即“观察”)也很可能非常多......比如说,5-6 个参数和 20 家公司,报告输出的数量显然会变成可笑。

如前所述,我已经快到了,但是对于如何将输出限制为仅“匹配”公司与职位的任何正确方向的推动,我们将不胜感激。

【问题讨论】:

    标签: r r-markdown knitr


    【解决方案1】:

    你可以像下面那样逐行迭代。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 2019-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多