r语言 - RMarkdown Chunk - 不要回显最后一个表达式



我在rmarkdown文档中有一个块,看起来像这样:

```{r, echo=-4}
a <- 1
b <- 2
x <- a + b
print(paste(c("`x` is equal to ", x), collapse=""))
```

当我编织此功能时,它不会如预期的那样显示第4个表达式。

a <- 1
b <- 2
x <- a + b
## [1] "`x` is equal to 3"

但是,如果我在块中添加另一行,我必须更新echo参数或隐藏错误的表达式:

```{r, echo=-4}
a <- 1
b <- 2
c <- 3
x <- a + b + c
print(paste(c("`x` is equal to ", x), collapse=""))
```

输出:

a <- 1
b <- 2
c <- 3
print(paste(c("`x' is equal to ", x), collapse=""))
## [1] "`x` is equal to 6"

是否有一个编程方式在rmarkDown零件中指定您不想在块中回荡 last Expression ,而无需手动计算行总数?

以下是一个黑客:使用knitr钩标记要删除输出的线并在打印输出时删除它们。
以下解决方案实现了一个名为rm.last的新块选项,该选项删除了源代码的n最后一行。
knitr具有用于源代码的内置块,因此您必须使用knitr::knit_hooks$get('source')进行检索。

---
title: "Hack the output with hooks"
---
```{r setup, include=FALSE}
knitr::opts_hooks$set(rm.last = function(options) {
  options$code <- 
    paste0(
      options$code, 
      c(rep("", length(options$code) - options$rm.last), 
        rep(" # REMOVE", options$rm.last)
      )
    )
  options
})
builtin_source_hook <- knitr::knit_hooks$get('source')
knitr::knit_hooks$set(source = function(x, options) {
  if (!is.null(options$rm.last))  
    x <- grep("# REMOVE$", x, invert = TRUE, value = TRUE)
  if (length(x) > 0) {
    return(builtin_source_hook(x, options))
  } else {
    invisible(NULL)
  }
})
```
```{r, rm.last=1}
a <- 1
b <- 2
x <- a + b
print(paste(c("`x` is equal to ", x), collapse=""))
```

但是,如果您的最后一行代码为 print(...),则显然必须遵循@atiretoo答案。

我喜欢做

```{r}
a <- 1
b <- 2
x <- a + b
```
`x` is equal to `r x`

可提供更清洁的结果输出。

不,没有办法做到这一点。如果您查看knitr源代码,您会看到它使用

的代码行的子集。
code = code[options$echo]

因此,它使用常规R索引选择条目。r无法以恒定值或值向量说"最后一个元素",因此rmarkdownknitr没有办法说"最后一个表达式"。使用 @atiretoo的建议(只要将其放在单独的块中(似乎是您最好的选择。

最新更新