图形编织引擎不会同时显示代码和结果

knit engine for graphs does not show code and result at the same time

这是

的跟进

我想附上图表和代码。

所以我有以下 Rmd 文件,它应该输出图形(取决于 eval)和代码(取决于 echo),但它不是图形,而是给出文件名。

我怎样才能让它显示图表和代码?我想,这是由传递给knitr::engine_output()options内部控制的,但是一旦指定code,我只得到文件名?

---
title: "Untitled"
output: html_document
---

```{r setup, include=FALSE}
knitr::knit_engines$set(Rlogo = function(options) {
  if (options$eval) {
    path <- 'logo.jpg'
    file.copy(file.path(R.home('doc'), 'html', 'logo.jpg'), path)
    out <- list(knitr::include_graphics(path))
  } else {
    out = ""
  }
  if (options$echo) {
    code <- options$code
  } else {
    code <- ""
  }
  knitr::engine_output(
    options, 
    out = out,
    code = code
  )
})
```


```{Rlogo echo = TRUE, eval = TRUE}
Whatever.
```

试试这个:

---
title: "Untitled"
output: html_document
---

```{r setup, include=FALSE}
knitr::knit_engines$set(Rlogo = function(options) {
    out <- list("")
  if (options$eval) {
    path <- 'logo.jpg'
    file.copy(file.path(R.home('doc'), 'html', 'logo.jpg'), path)
    out <- list(knitr::include_graphics(path))
  }
  if (options$echo)
    out <- c(out, options$code)
  knitr::engine_output(
    options, 
    out = out
  )
})
```


```{Rlogo, echo = TRUE, eval = TRUE}
Whatever.
```

好的 - 我找到了解决方案:

--
title: "Untitled"
output: html_document
---

```{r setup, include=FALSE}
knitr::knit_engines$set(Rlogo = function(options) {
  result <- list(cose = "", out = "")
  if (options$eval) {
    path <- 'logo.jpg'
    file.copy(file.path(R.home('doc'), 'html', 'logo.jpg'), path)
    result$out <- knitr::engine_output(
      options, 
      out = list(knitr::include_graphics(path))
    )
  }
  if (options$echo)
  result$code <- knitr::engine_output(
    options, 
    code = options$code,
    out = NULL
  )
  return(paste(result$code, result$out, sep = "\n\n"))
})
```


```{Rlogo, echo = TRUE, eval = TRUE}
Whatever.
```

有效,因为函数 knitr::engine_output() 只是 returns 一个字符串。这两个字符串只需要附加两个换行即可。