【问题标题】:knitr: wrapping computer output in HTML tagsknitr:将计算机输出包装在 HTML 标签中
【发布时间】:2014-03-16 06:22:17
【问题描述】:

使用 knitr,我试图将输出包装在特定类的 div 中。例如,下面是代码:

```{r}
# Print the pressure data set
head(pressure)
````

我希望将输出(而不是代码)包装在一个 div 中,例如 <div class='myclass'>,因为该类提供了对输出的特殊控制。 (在我的情况下,它将显示在 2 列中)

我在 StackOverflow 上找到了另一个问题,但提供的答案将代码和输出包装在 div 中,而我只是希望输出进入 div。

这可以用knitr完成吗?

编辑:

这是当前生成的内容:

<pre class="r"><code>head(pressure)</code></pre>
<pre><code>##   temperature pressure
## 1           0   0.0002
## 2          20   0.0012
## 3          40   0.0060
## 4          60   0.0300
## 5          80   0.0900
## 6         100   0.2700</code></pre>

我想要这样的东西:

<pre class="r"><code>head(pressure)</code></pre>
<div class="myclass">
<pre><code>##   temperature pressure
## 1           0   0.0002
## 2          20   0.0012
## 3          40   0.0060
## 4          60   0.0300
## 5          80   0.0900
## 6         100   0.2700</code></pre>
</div>

但我希望它可以针对特定的块进行定制。也就是说,我希望能够设置块选项,以便某些块的输出为myclass,而其他块的输出为otherclass

【问题讨论】:

  • 在页面 goo.gl/Og7Xhj 的输出挂钩部分中,“源”和“输出”之间存在差异。也许这有帮助。目前我无法在这里测试。
  • 为清楚起见,请您显示生成的 HTML 以及您希望看到的 HTML。
  • 您指的是“StackOverflow 上的其他问题”,但不是链接。这是不久前的事了,但您有机会使用链接进行编辑吗?

标签: r html knitr


【解决方案1】:

这是一个最小的例子:

```{r setup, include=FALSE, cache=FALSE, results='asis'}
knit_hooks$set(
  output = function(x, options) {
    # any decoration here
    paste0("<div class='myout'>", x, "</div><br/>")
    }
  )

```

<style>
.myout {background:red}
</style>

```{r}
mean(1:3)
sd(1:3)
var(1:3)
```

更新

也许这会有所帮助。

```{r setup, include=FALSE, cache=FALSE, results='asis'}
ho0 <- knit_hooks$get('output')

knit_hooks$set(
  output = function(x, options) {
    if (is.null(options$class)) ho0(x)
    else 
      # any decoration here
      paste0("<div class='", options$class, "'>", ho0(x), "</div><br/>")
    }
  )

```

<style>
.myout {background:red}
.myout2 {background:skyblue}
</style>

```{r}
mean(1:3)
```
```{r class="myout"}
sd(1:3)
```
```{r class="myout2"}
var(1:3)
```

请注意,您可以在 .Rmd 之外定义挂钩。 在knit 之前调用knit_hook$set

【讨论】:

  • 谢谢!但是是否可以对其进行自定义,使其看起来更像来自render_markdownoutput 方法?查看render_markdownoutput 方法调用hook.t。我希望 .md 输出尽可能接近正常。我想我可以从render_markdown 复制那些其他函数,但是我必须在 Rmd 文档中放入的代码越少越好。
  • 首先,render_markdown 定义了生成md 的函数,而不是html。您可以定义您原来的render_hoge() 函数,因此自定义输出非常容易。但是如果你想在最终的 html 中使用类似&lt;div class="orz"&gt; 的东西,你需要直接在 .md 或 .Rmd 中编写 html 标签。这就是markdown的局限性。
  • 更新的版本很有帮助,但理想情况下,它还可以使用 render_markdown 内部的函数格式化输出,添加 &lt;pre&gt;&lt;code&gt; 标签,添加 ##,并处理缩进等。我意识到自己可以重新实现这一切,但我不希望这样做。不过谢谢,这个解决方案现在可以满足我的目的了。
猜你喜欢
  • 2019-04-27
  • 2013-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多