我正在尝试创建一个通用的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文件并将参数传递给它?还是会有另一种方法来完成我想要做的事情?
答案 0 :(得分:16)
另一种选择是使用params
函数中的rmarkdown::render
列出变量,请参阅: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
数据集,但仅绘制cyl
,wt
,mpg
和qsec
的直方图。
答案 1 :(得分:4)
我认为你可以使用knit2html
包中的knitr
来做“魔术”。
您可以像这样定义降价文件并将其另存为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)
}
在test.R中,您可以准备数据:
myDF <- read.delim("mydata.tab")
ivs <- c("iv1", "iv2", "iv3")
dvs <- c("dv1", "dv2", "dv3")
使用knitr编译
Knit2html('mydoc.Rmd')
答案 2 :(得分:1)
我认为https://github.com/yihui/knitr/issues/567
提供了另一种选择您必须提前创建这些参数,例如
args='2013'
knit('../my.Rmd','test.html')
然后knit()
将识别my.Rmd;
中的args,如果您想了解详细信息,请参阅envir
参数