【问题标题】:When running knit to .Rmd output the chunks are not valid运行 knit 到 .Rmd 输出时,块无效
【发布时间】:2017-12-21 00:55:42
【问题描述】:

问题

当试图将包含read_chunk 行的purl 脚本中的knit .Rmd 放入父.Rmd 中时,块不完整,仅形成代码块。我希望能够正常knit输出文件。

代码

ma​​in.Rmd

---
output: html_document
---

```{r, include=FALSE}
knitr::read_chunk("script_chunk.R")
```

### Print sessionInfo()

```{r, ref.label='script_chunk', eval=FALSE}
``` 

script_chunk.R

# ---- script_chunk
sessionInfo()

针织

当我用knit("main.Rmd", "output.Rmd") 处理这个时,会生成以下文件:

---
output: html_document
---



### Print sessionInfo()


```r
sessionInfo()
```

但是,该块的期望输出是:

```{r script_chunk}
sessionInfo()
```

当我目前knitoutput.Rmd 时,我只得到一个未评估的代码块,因为该块缺少花括号(最好是块名称)。

解决方法

我可以使用readLines 来实现我所追求的,例如:

```{r, results='asis', collapse=TRUE, echo=FALSE}
cat("```{r script_chunk}\n")
cat(paste(readLines("script_chunk.R"), "\n", collapse = ""))
cat("```\n")
```

有没有更优雅的方法来做到这一点?

【问题讨论】:

  • 将一个 Rmd 编​​入另一个 Rmd 感觉很奇怪。
  • 你确定你能做到吗? output.Rmd 不只是一个扩展名错误的 Markdown 文档吗?
  • 这就是我这么说的原因。你确定你没有生成一个简单的降价文档,这就是为什么你会得到一个不可执行的 R 块。
  • 你不能只使用eval = TRUE然后直接将结果打印到HTML吗?
  • @F.Privé,不,中间文件需要重新生成,不能访问原始子文件

标签: r knitr


【解决方案1】:

还有一个稍微更优雅的解决方案:

# main.Rmd
---
output: html_document
---

### Print sessionInfo()

```{r, results="asis", echo = FALSE}
chunk_lines <- knitr::spin(text = readLines("script_chunk.R"), knit = FALSE)
cat(chunk_lines, sep = "\n")
```

但请记住,就knitr 而言,您的输出是纯 Markdown。 knitr 只能 output to certain formats:LaTeX、Sweave、HTML、Markdown 或 Jekyll。虽然您的输出文件具有 .Rmd 扩展名,但其内容是纯 Markdown,因为这是 R Markdown 文件的默认设置。

因此请注意,您想要在输出中的所有代码块都必须写为动态输出。这可能会让您在main.Rmd 中留下混淆代码。

【讨论】:

  • 这当然是一个进步!如果您希望能够通过knit 发送来自main.Rmd 的最终文档或中间文档,您对如何实现它有任何想法吗?
【解决方案2】:

我使用的另一种方法是 knit_child:

  • main.Rmd

    ---
    output: html_document
    ---
    
    ```{r, include=FALSE}
    out <- knitr::knit_child("script_chunk.Rmd")
    ```
    
    ### Print sessionInfo()
    ```{r, ref.label='script_chunk'}
    paste(out, collapse = "\n")
    ```
    
  • script_chunk.Rmd

    ```{r script_chunk}
    # ---- script_chunk
    sessionInfo()
    ```
    

编译时:

---
output: html_document
---

### Print sessionInfo()

```r
# ---- script_chunk
sessionInfo()
```

```
## R version 3.3.3 (2017-03-06)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 16299)
## ... blah blah blah ...
```

想法:

  1. out 是一个可怕的名字;
  2. 我经常使用它在零个或多个事物上迭代单个子文档(它处理一个“事物”),因此 out 可以包含对 knit_child 的多次调用的串联结果

【讨论】:

  • 感谢您加入对话。我仍然支持 Nathan 早期的方法,因为子文档是 .R 脚本(来自 purl)而不是 R Markdown。此外,在output.Rmd 中,块的输出是不可取的,只有块的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 2017-09-22
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
相关资源
最近更新 更多