使用knitr设置HTML元素的元属性

9
我正在使用knitr生成HTML报告,希望包含作者和生成日期的元标签。
我的Rhtml页面大致如下。
<html>
<head>
  <meta name="author" content="<!--rinline Sys.getenv('USERNAME') -->">
  <meta name="date" content="<!--rinline as.character(Sys.time()) -->"> 
</head>
<body>
</body>
</html>

很遗憾,在我运行knit("test.Rhtml")之后,knitr生成的HTML如下:

  <meta name="author" content="<code class="knitr inline">RCotton</code>">
  <meta name="date" content="<code class="knitr inline">2013-01-02 14:38:16</code>"> 

这不是有效的HTML。我真正希望生成的是像下面这样的东西

  <meta name="author" content="RCotton">
  <meta name="date" content="2013-01-02 14:38:16">

我能不能生成没有code标签包裹的R代码呢?或者还有其他方法可以指定标签属性(比如这些内容属性)吗?

到目前为止,我最不坏的计划是使用readLines/str_replace/writeLines手动修复内容,但这似乎相当笨拙。


你也可以直接使用 brew 安装该文件。 - daroczig
2个回答

13

另一种(未记录的)方法是在内联代码周围添加I(),以原样打印字符而无需<code>标签,例如:

<html>
<head>
  <meta name="author" content="<!--rinline I(Sys.getenv('USERNAME')) -->">
  <meta name="date" content="<!--rinline I(as.character(Sys.time())) -->"> 
</head>
<body>
</body>
</html>

我认为新增的knit_expand函数在这里是理想的选择。通过先将文件传递给knit_expand,然后再使用knit2html,您可以轻松地实现brewknitr的最佳效果。也许@Yihui可以补充一下。 - Ramnath
@DieterMenne 当然可以,我会添加到网站上;@Ramnath 在这种情况下,如果文件中还有其他块,则 <!--rinline --> 不是一个坏选择,并且在 knit() 之前需要使用 knit_expand() - Yihui Xie
@yihui 有道理。但是 knit_expand 提供了类似于 brew 的功能,这是 Sweave 用户长期以来一直在寻找的。减少工具链的一种方法是允许用户指定 opts_knit$set(expand = TRUE),这将在编织文档之前通过 knit_expand 运行文档。或者,可以使用文档钩子来实现,我认为这更有意义,因为 knit_expand 可以使用父帧中的数据。 - Ramnath

4

虽然不是很好,但似乎可以在不添加钩子的情况下正常工作:

<head>
<!--begin.rcode results='asis', echo=FALSE
cat('
  <meta name="author" content="', Sys.getenv('USERNAME'), '"> 
  <meta name="date" content="', as.character(Sys.time()),'-->"> 
',sep="")
end.rcode-->

</head>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接