【问题标题】:How can I pass variables into an R markdown .Rmd file?如何将变量传递到 R markdown .Rmd 文件中?
【发布时间】:2013-09-21 06:45:55
【问题描述】:

我正在尝试创建一个通用的 rmarkdown 模板,该模板将对数据框进行分析。我希望能够将数据帧传递给 rmarkdown 文件,而不是每次都对其进行硬编码。

下面是我一直在试验的一个 sn-p。您可以在顶部看到我必须加载数据框(mtcars)。我还手动识别自变量 (ivs) 和因变量 (dvs)。我想将这些作为参数传递。我正在尝试做一个快速而肮脏的 SPSS 探索功能版本。 “探索.Rmd”:

```{r}
library(ggplot2)
data(mtcars)
mtcars$am <- factor(mtcars$am, levels=c(0,1), labels=c("Manual", "Automatic"))
df <- mtcars
ivs <- c("cyl", "disp", "hp", "drat", "wt", "am", "qsec")
dvs <- c("mpg", "qsec")
```

Histograms
-------------------------------------

```{r}
for (v in union(ivs, dvs))
{
  hist <- ggplot(df, aes_string(x=v)) + geom_histogram()
  print(hist)
}
```

我想要看起来像这样的代码,以使用 knitr 或类似的东西生成 HTML。

myDF <- read.delim("mydata.tab")
ivs <- c("iv1", "iv2", "iv3")
dvs <- c("dv1", "dv2", "dv3")
magic("Explore.Rmd", myDF, ivs, dvs) # <- how do I do this part?

那么,是否有可能拥有一个静态的 rmarkdown 文件并向其传递参数?还是有其他方法可以完成我想做的事情?

【问题讨论】:

标签: r r-markdown


【解决方案1】:

另一种选择是在rmarkdown::render 函数中使用params 列出您的变量,请参阅:http://rmarkdown.rstudio.com/developer_parameterized_reports.html

首先,在 rmarkdown 文档的 YAML 中声明并提供参数的默认值:

---
title: My Document
output: html_document
params:
    df: !r data(mtcars); mtcars
    ivs: ["cyl", "disp", "hp", "drat", "wt", "am", "qsec"]
    dvs: ["mpg", "qsec"]
---

然后可以通过params列表在报告正文中访问这些内容:

Histograms
-------------------------------------

```{r}
for (v in union(params$ivs, params$dvs))
{
   hist <- ggplot(params$df, aes_string(x=v)) + geom_histogram()
   print(hist)
}
```

最后,通过将命名参数列表传递给rmarkdown::render 来覆盖默认值:

myDF <- read.delim("mydata.tab")
ivs <- c("iv1", "iv2", "iv3")
dvs <- c("dv1", "dv2", "dv3")
rmarkdown::render("MyDocument.Rmd", 
                  params = list(df = myDF, ivs = ivs, dvs = dvs))

由于 YAML 定义了默认值,因此只需提供希望覆盖的内容,例如,

rmarkdown::render("MyDocument.Rmd", params = list(ivs = c("cyl", "wt")))

仍将使用mtcars 数据集,但仅绘制cylwtmpgqsec 的直方图。

【讨论】:

    【解决方案2】:

    我认为您可以使用 knitr 包中的 knit2html 来实现“魔法”。

    1. 你像这样定义你的降价文件并将它保存为 mydoc.Rmd

       ```{r}
       source('test.R')
       ```
       ```{r}
      library(ggplot2)
      for (v in union(ivs, dvs))
      {
         hist <- ggplot(myDF, aes_string(x=v)) + geom_histogram()
       print(hist)
      }
      
    2. 在 test.R 中,您准备数据:

      myDF <- read.delim("mydata.tab")
      ivs <- c("iv1", "iv2", "iv3")
      dvs <- c("dv1", "dv2", "dv3")
      
    3. 你使用 knitr 编译

      Knit2html('mydoc.Rmd')
      

    【讨论】:

    • 嗯.. 那么数据在哪里传递?当用户运行Knit2html('mydoc.Rmd') 时,不应该在该调用中传递“mydata.tab”吗?
    【解决方案3】:

    我认为https://github.com/yihui/knitr/issues/567提供了一个替代方案

    您必须提前创建这些参数,例如

    args='2013'
    knit('../my.Rmd','test.html')
    

    然后knit() 将识别my.Rmd; 中的args,如果您想了解详细信息,请参阅envir 参数

    【讨论】:

      猜你喜欢
      • 2013-04-01
      • 2021-06-14
      • 2020-05-11
      • 2013-06-07
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多