【问题标题】:Show an R markdown chunk in the final output在最终输出中显示一个 R 降价块
【发布时间】:2013-11-23 08:40:14
【问题描述】:

我正在使用 Knitr、Markdown 和 Slidify 撰写演示文稿。幻灯片将部分处理 Knitr 作为主题,这就是我偶然发现一个问题的原因。例如,我不能包含一个 knitr-markdown 块以在幻灯片上显示它。即使我做了这样的事情,它也会在第一次运行时被解释:

```
```{r eval = F, include = T}

```
``` 

如何防止一个块被解释并从最终输出中删除,以便在使用 Markdown 和 Knitr 时显示一个块的结构?

编辑:

我尝试了@Ramnath 的版本并制作了以下幻灯片:

## Testslide 1

```{r verbatimchunk, verbatim = TRUE}
x = 1 + 1
x
```

```{r regularchunk}
x = 1 + 1
x
```

---

## Testslide 2

```{r verbatimchunk_2, verbatim = TRUE}
x = 1 + 1
x
```

* element 1
* element 2

---

## Testslide 3

* element 1
* element 2


```{r verbatimchunk_3, verbatim = TRUE}
x = 1 + 1
x
```

前两张幻灯片工作正常,但最后一张是问题所在。如果在逐字块之前有一个项目符号列表,它会像往常一样被解释。所以它与@Scott 的第一个解决方案相同。我不明白这个。

编辑 2/3(工作解决方案)

```{r echo = FALSE}
require(knitr)
hook_source_def = knit_hooks$get('source')
knit_hooks$set(source = function(x, options){
  if (!is.null(options$verbatim) && options$verbatim){
    opts = gsub(",\\s*verbatim\\s*=\\s*TRUE\\s*", "", options$params.src)
    bef = sprintf('\n\n    ```{r %s}\n', opts, "\n")
    stringr::str_c(bef, paste(knitr:::indent_block(x, "    "), collapse = '\n'), "\n    ```\n")
  } else {
     hook_source_def(x, options)
  }
})
```

## Testslide

* Element one
* Element two


Some text here breaks list environment:

```{r verbatim = T}
any code
```

【问题讨论】:

  • 怀疑这是可能的。也许可以使用cat() 来逐字引用您需要的 knitr 代码,尽管我只能部分地做到这一点,最终的“```” 不会呈现。或者,您可以插入一组特定的符号,例如“/myknitrcode_start”,然后在编织原始文档后用正确的代码查找并替换它。或者编写一个 R 函数来做到这一点。

标签: r markdown knitr slidify


【解决方案1】:

这是另一个使用块挂钩的解决方案。这个想法是,如果你有一个带有选项verbatim = TRUE 的块,它会激活钩子并逐字输出块。我已经检查过它是否也适用于 Slidify。

```{r echo = FALSE}
require(knitr)
hook_source_def = knit_hooks$get('source')
knit_hooks$set(source = function(x, options){
  if (!is.null(options$verbatim) && options$verbatim){
    opts = gsub(",\\s*verbatim\\s*=\\s*TRUE\\s*", "", options$params.src)
    bef = sprintf('\n\n    ```{r %s}\n', opts, "\n")
    stringr::str_c(bef, paste(knitr:::indent_block(x, "    "), collapse = '\n'), "\n    ```\n")
  } else {
     hook_source_def(x, options)
  }
})
```

```{r verbatimchunk, verbatim = TRUE}
x = 1 + 1
x
```

```{r regularchunk}
x = 1 + 1
x
```

编辑:在列表之后使用代码块的技巧是需要破坏列表环境。一种快速而肮脏的方法就是添加一个空的段落元素。或者,您可以修复挂钩,以便在代码块的开头自动添加一个空段落。

* element 1
* element 2

<p></p>
```{r verbatimchunk_3, verbatim = TRUE}
x = 1 + 1
x
```

【讨论】:

  • 我更新了上面的帖子。您的解决方案与 Scott 建议的问题相同。
  • 如果你看一下markdown,你会看到这个块是用块包装器输出的。我认为降价仍然将其解释为列表的一部分,因为它尚未关闭。如果您在代码块之前添加任何文本,它将破坏列表并显示您寻找的输出。
  • 默认钩子可以通过knit_hooks$get('source')获得,我不喜欢从knitr复制它的源代码,因为将来我想更新它时可能会束缚我的手。使用hook_source &lt;- knit_hooks$get('source') 会更安全,然后在knit_hooks$set(source = ...) 中使用hook_source
  • 我记得我为什么要硬编码它。这是在knitr 的更新破坏了一些东西的时候。但是您已修复它,因此现在您推荐的方法是更好的方法。我会更新我的答案。
【解决方案2】:

我认为你需要在```{r}之后添加一个空字符串,并且knitr不会执行该块,而是会显示它。见例子here

幻灯片上的这个对我有用(顶部执行而底部不执行)

---

```{r}
list(5, 6, 7)
```


    ```{r}`r ''`
    hist(rnorm(100))
    5 + 6
    ```

---

【讨论】:

  • 但不得不说有点脆。不适用于滑动幻灯片的所有位置。仅当块位于幻灯片的第一个位置时。否则它会像往常一样被解释。
  • 幻灯片的第一个位置是什么意思?
  • 要在这方面获得更多帮助,knitr google group 可能是你最好的选择,虽然 Yihui 也在附近
  • 例如,如果我有一个列表。这仅适用于列表之前,而不适用于幻灯片上的列表之间或之后。
  • “有时有效,有时无效”只是由于 Markdown 语法:如果您在列表下缩进段落,则该段落将被视为列表的一部分;正如 Ramnath 建议的那样,您必须使用 &lt;p&gt;&lt;/p&gt; 或其他方式终止列表。
【解决方案3】:

聚会很晚,但这似乎也有效:

```{r echo=FALSE, class.output="r", comment=""}
cat("```{r}\nx <- 1 + 1\nx\n```")
```

或者,等效但也许更好读和写:

```{r echo=FALSE, class.output="r", comment=""}
cat(paste(sep = "\n",
  "```{r}",
  "x <- 1 + 1",
  "x",
  "```"
))
```

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    相关资源
    最近更新 更多