Настройка метаэлементов HTML с помощью Knitr

Я создаю HTML-отчеты с помощью Knitr и хочу включить метатеги автора и даты создания.

Моя страница 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"), HTML-код, который генерирует Knitr,

  <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">

Могу ли я сгенерировать код R, который не содержит тега code? Или есть другой способ указать атрибуты тега (например, эти атрибуты контента)?

Пока что мой наименее худший план состоит в том, чтобы вручную исправить содержимое с помощью readLines/str_replace/writeLines, но это кажется довольно неуклюжим.


person Richie Cotton    schedule 02.01.2013    source источник
comment
Вы также можете просто brew этот файл.   -  person daroczig    schedule 02.01.2013


Ответы (2)


Другой (недокументированный) подход состоит в том, чтобы добавить 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>
person Yihui Xie    schedule 02.01.2013
comment
Я считаю, что недавно добавленная функция knit_expand была бы идеальной здесь. Пропустив файл сначала через knit_expand, а затем через knit2html, вы можете легко получить лучшее из brew и knitr. Может быть, @Yihui может добавить к этому. - person Ramnath; 03.01.2013
comment
@DieterMenne, конечно, добавлю на сайт; @Ramnath, в этом случае <!--rinline --> неплохой выбор, если в файле есть дополнительные фрагменты, а knit_expand() будет дополнительным шагом перед knit() - person Yihui Xie; 04.01.2013
comment
@yihui Имеет смысл. Но Knit_expand предоставляет brew функциональность, которую давно ищут пользователи Sweave. Один из способов сократить цепочку инструментов — разрешить пользователям указывать opts_knit$set(expand = TRUE), который будет запускать документ через knit_expand перед его вязанием. В качестве альтернативы, этого можно добиться с помощью хука документа, что, на мой взгляд, имеет больше смысла, поскольку в этом случае Knit_expand может использовать данные из родительского фрейма. - person Ramnath; 04.01.2013

Не очень приятно, но, кажется, работает без добавления хука:

<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>
person Dieter Menne    schedule 02.01.2013