从变量中生成 Rmarkdown 代码块名称

8
我应该怎样将变量作为块名使用呢?我有一个子文档,需要多次调用,我需要以这样一种方式推进块标签,以便我也可以交叉引用它们。
类似于这样:
child.Rmd
```{r }
if(!exists('existing')) existing <- 0
existing = existing + 1
myChunk <- sprintf("myChunk-%s",existing)
```

## Analysis Routine `r existing`

```{r myChunk,echo = FALSE}
#DO SOMETHING, LIKE PLOT
```

master.Rmd

# Analysis Routines

Analysis for this can be seen in figures \ref{myChunk-1}, \ref{myChunk-2} and \ref{myChunk-3}

```{r child = 'child.Rmd'}
```

```{r child = 'child.Rmd'}
```

```{r child = 'child.Rmd'}
```

编辑潜在解决方案

以下是一个可能的解决方法,灵感来自于SQL注入...

child.Rmd

```{r }
if(!exists('existing')) existing <- 0
existing = existing + 1
myChunk <- sprintf("myChunk-%s",existing)
```

## Analysis Routine `r existing`

```{r myChunk,echo = FALSE,fig.cap=sprintf("The Caption}\\label{%s",myChunk)}
#DO SOMETHING, LIKE PLOT
```

有趣的问题--你在问动态块名称吗?我不确定这是否可能...如果你更具体地说明你想做什么,可能会有有效的解决方法,比如创建一个图表列表并逐个从列表中调用。 - C8H10N4O2
我已经修改了问题以更好地反映我的问题。 - Nicholas Hamilton
@C8H10N4O2 我已经发布了一个潜在的解决方法,将“标签”注入到图题中。 - Nicholas Hamilton
很酷,也许你应该把它作为一个答案添加进去。我这里没有什么好主意。 - C8H10N4O2
3个回答

2

建议在knitting&rendering之前,将Rmd文件预先编织到另一个Rmd文件中,如下所示:

master.Rmd:

# Analysis Routines

Analysis for this can be seen in figures `r paste(paste0("\\ref{", CHUNK_NAME, 1:NUM_CHUNKS, "}"), collapse=", ")`

@@@
rmdTxt <- unlist(lapply(1:NUM_CHUNKS, function(n) {
    c(paste0("## Analysis Routine ", n),
        paste0("```{r ",CHUNK_NAME, n, ", child = 'child.Rmd'}"),
        "```")
}))
writeLines(rmdTxt)

@@@

child.Rmd:

```{r,echo = FALSE}
plot(rnorm(100))
```

编织并渲染Rmd:

devtools::install_github("chinsoon12/PreKnitPostHTMLRender")
library(PreKnitPostHTMLRender)   #requires version >= 0.1.1

NUM_CHUNKS <- 5
CHUNK_NAME <- "myChunk-"
preknit_knit_render_postrender("master.Rmd", "test__test.html")

希望这能有所帮助。祝好!

дёәдәҶиҝӣиЎҢеё–еӯҗHTMLжёІжҹ“пјҢжҲ‘дҪҝз”Ё`%%%`жқҘиҜҶеҲ«йңҖиҰҒи§Јжһҗзҡ„д»Јз Ғ...жҲ‘и®ӨдёәдҪ еҸӘйңҖиҰҒйў„е…Ҳзј–з»ҮйғЁеҲҶ...дҪҶжҳҜдҪ зҡ„еҠЁжҖҒж ҮйўҳеңЁеӯҗж–ҮжЎЈдёӯ...и®©жҲ‘и®°еҪ•дёӢжҲ‘зҡ„зӯ”жЎҲ并еҶҚиҖғиҷ‘дёҖдёӢгҖӮ - chinsoon12

1
如果你已经达到这种复杂程度,我建议你查看brew包。它提供了一个模板引擎,您可以在其中动态创建用于编织的Rmd。您可以在外部brew环境中引用R变量,并从那里构建您的动态Rmd。

1

使用knitr::knit_expand()函数可以实现动态块名称。在子文档中,包括块标题,都可以使用{{arg_name}}引用参数。

因此,我的父级文档包含:

```{r child_include, results = "asis"}
###
# Generate a section for each dataset
###
species <- c("a", "b")

out <- lapply(species, function(sp) knitr::knit_expand("child.Rmd"))

res = knitr::knit_child(text = unlist(out), quiet = TRUE)
cat(res, sep = "\n")
```

我的子文档没有YAML头,包含如下内容:

# EDA for species {{sp}}

```{r getname-{{sp}}}
paste("The species is", "{{sp}}")
```

请参见RMarkdown菜谱中的这里

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