如何将变量传递到R markdown .Rmd文件中?

13

我正在尝试创建一个通用的rmarkdown模板,可以对数据框进行分析。我想要能够将数据框传递到rmarkdown文件中,而不是每次硬编码。

下面是我一直在尝试的代码片段。你可以看到,在顶部我需要加载数据框(mtcars)。我还手动标识了自变量(ivs)和因变量(dvs)。我想把它们作为参数传递进去。我正在尝试快速脏的SPSS Explore功能版本。"Explore.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文件并传递参数给它?或者是否有另一种方法可以实现我想做的事情?


2
请查看knit_expand()函数。 - baptiste
我们在哪里可以找到 knit_expand 函数?你是指这个吗:http://cran.r-project.org/web/packages/knitr/vignettes/knit_expand.html? - Marcin
3个回答

30

另一种选项是在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的直方图。


4
我认为你可以使用knitr包中的knit2html来完成这个“魔术”。
  1. You define your markdown file like this and save it as 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. In test.R you prepare your data :

    myDF <- read.delim("mydata.tab")
    ivs <- c("iv1", "iv2", "iv3")
    dvs <- c("dv1", "dv2", "dv3")
    
  3. You compile using knitr

    Knit2html('mydoc.Rmd')
    

2
那么数据是在哪里传递的呢?当用户运行 Knit2html('mydoc.Rmd') 时,不应该在该调用中传递 "mydata.tab" 吗? - mindlessgreen

1
我认为在https://github.com/yihui/knitr/issues/567中提供了一种替代方法。
你需要预先创建这些参数,例如:
args='2013'
knit('../my.Rmd','test.html')

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接