【问题标题】:injecting HTML lines using knitr markdown使用 knitr markdown 注入 HTML 行
【发布时间】:2012-06-13 13:02:18
【问题描述】:

有没有办法将 R 代码输出注入到生成的文档中,而不需要环绕格式标签 <pre><code class="r"><pre><code>?我问这个是因为我想使用 .Rmd 而不是 .Rhmtl 但同时注入一些额外的 HTML 行。这样做使用例如cat("HTML code") 将失败,因为输出被 <pre><code> 包围。

我尝试运行以下 .Rmd 文件(带有额外的 HTML 行)的示例,该文件无法正常工作:

<script type="text/javascript">
<!--
function toggle_visibility(id) {
  var e = document.getElementById(id);
  if(e.style.display == 'none')
    e.style.display = 'block';
  else
    e.style.display = 'none';
}
//-->
</script>  

```{r}
1:10
```

<a onclick="toggle_visibility('answer_1');"><b><u>Antwort anzeigen</b></u></a>
<div id="answer_1" style=display:none>
```{r}
1:10
```
</div>

【问题讨论】:

  • 你能最后展示你想要的吗?
  • 你的 JS 脚本也可以为你做这件事。
  • @kohske 我想要的是与第二部分中通常的 R 输出相同的格式。我希望能够显示和隐藏输出的第二部分。目前输出的第二部分被销毁了。
  • @daroczig:我是 JavaScript 新手,欢迎提出任何想法 :)
  • 我想要的是something like this 但使用markdown Rmd.:

标签: r knitr


【解决方案1】:

您应该可以使用knitr's hooks 执行此操作。您可能需要查看源代码以了解 render_markdown() 的默认挂钩是什么:

> library(knitr)
> render_markdown()
> knit_hooks$get('echo')
NULL
> knit_hooks$get('message')
function (x, options) 
{
    if (strict) {
        str_c("\n\n", indent_block(x), "\n")
    }
    else str_c("\n\n```\n", x, "```\n\n")
}
<environment: 0x2a3f590>
> knit_hooks$get('output')
function (x, options) 
if (output_asis(x, options)) x else hook.t(x, options)
<environment: 0x2a3f590>
> knitr:::output_asis
function (x, options) 
{
    is_blank(x) || options$results == "asis"
}
<environment: namespace:knitr>

我不确定 hook.t 到底是做什么的,但请检查一下。

另外,您是否尝试过 asis 选项?我不完全清楚你希望如何格式化,但你可以让它与 asis 一起工作。

你可以用钩子做很多很酷的事情。

【讨论】:

  • 如果您对knitr 中的默认输出挂钩感兴趣,请参阅github.com/yihui/knitr/blob/master/R/hooks-md.R;我同意你的观点,这个问题可以用钩子更好地回答,但chunk hooks 可能会更好
  • 同意。特别是如果他不介意更改 Rmd 以添加选项。我发现在编织时增加 knitr 钩子而不更改源文档很方便。但是,我所做的并不特定于一个甚至几个文档,所以我不想处理添加块选项。如果他只想为一两个文档执行此操作,那么块挂钩可能会更好。
【解决方案2】:

我现在所做的是遵循 darozcig 的建议,我使用了 JS。不过,这个解决方案似乎很乏味。更容易整齐合身的 knitr 会更好!在我完整的 .Rmd 脚本下方。

<script type="text/javascript">
<!--
function toggle_visibility(id) {
  var e = document.getElementById(id); 
  if(e.style.display == 'none')
    e.style.display = 'block';
  else
    e.style.display = 'none';
}

function answer_top(name){
  var injection1 = '<a onclick=toggle_visibility("' + name + '")><b><u>Show answer</b></u></a>\n'
  document.write(injection1 + "\n")
  var injection2 = '<div id="' + name + '"style=display:none>'
  document.write(injection2 + "\n")
}

function answer_bottom() {
  document.write("</div>" + "\n")
}
//-->
</script>  

```{r}
1:10
```

<script type="text/javascript">answer_top("answer1")</script>
```{r}
1:10
```
<script type="text/javascript">answer_bottom()</script>

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 2012-11-30
  • 2020-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
相关资源
最近更新 更多