Генерировать комментарии по меткам внутри цикла
Я пытаюсь создать отчет HTML, используя knitr, на основе R script, который имеет для циклов. Я хочу создать комментарии по комментариям в комментариях в цикле for, но я не уверен, что это возможно.
Вот простой пример, это в test.R:
for (i in 1:5) {
## This is a heading for `i`
#' This is a comment for `i`
print(i)
}
Затем я использую spin для создания файла Rmd:
спин ( 'test.r')
Однако, файл Rmd выглядит следующим образом.
```{r }
for (i in 1:5) {
## This is a heading for `i`
#' This is a comment for `i`
print(i)
}
```
Замечания по уценке в блоке R не компилируются в HTML. Возможно ли это?
Спасибо,
Питер
Ответы
Ответ 1
Я думаю, что вы можете получить то, что хотите в knitr, с параметром option code = "asis", который вы можете указать после "# +" в R script, который будет передан во вращение (но код выглядит меньше) чистый ", чем интересное решение brew, предложенное @daroczig):
#+ results='asis', echo = FALSE
for (i in 1:5) {
cat("## This is a heading for ", i, "\n")
cat("<!-- This is a comment for ", i, "-->\n")
print(i)
}
Если это test.R script и что вы делаете spin ( "test.R" ), то полученный md файл будет выглядеть следующим образом:
## This is a heading for 1
<!-- This is a comment for 1 -->
[1] 1
## This is a heading for 2
<!-- This is a comment for 2 -->
[1] 2
## This is a heading for 3
<!-- This is a comment for 3 -->
[1] 3
## This is a heading for 4
<!-- This is a comment for 4 -->
[1] 4
## This is a heading for 5
<!-- This is a comment for 5 -->
[1] 5
Ответ 2
Я реализовал некоторые функции knitr
независимо от @Yihui на основе brew
в моем pander пакете, который может помочь с такими (и схожими) проблемами, если вы не хотите запускать brew
до knit
ting. Быстрая демонстрация:
> Pandoc.brew(text = "# Demonstrating a nice loop
+ <% for (i in 1:5) { %>
+ ## This is a header for <%=i%>
+ #' This is a comment for <%=i%>
+ <% } %>")
# Demonstrating a nice loop
## This is a header for _1_
#' This is a comment for _1_
## This is a header for _2_
#' This is a comment for _2_
## This is a header for _3_
#' This is a comment for _3_
## This is a header for _4_
#' This is a comment for _4_
## This is a header for _5_
#' This is a comment for _5_
Обратите внимание, что вы также можете передать файл в Pandoc.brew
(нет необходимости использовать такую неприятную настройку с аргументом text
с реальными проблемами), и что вы также можете использовать теги <% ... %>
, например. условные обозначения (например, отображение или отсутствие части отчета). И самое главное: существует огромная разница между <% ... %>
(необработанные команды R) и <%= ... %>
(результаты обрабатываются тегами pander
). Последнее означает, что все возвращенные объекты R преобразуются в уценку Pandoc, например:
> Pandoc.brew(text = "# Demonstrating a conditional
+ <% for (i in 1:5) { %>
+ ## This is a header for <%=i%>
+ <% if (i == 3) { %>
+ Hey, that **almost** <%=pi%>, that between <%=3:4%>! Wanna fit a model to _celebrate_?
+ <%= lm(mpg ~ hp, mtcars) %>
+ <% }} %>")
# Demonstrating a conditional
## This is a header for _1_
## This is a header for _2_
## This is a header for _3_
Hey, that **almost** _3.142_, that between _3_ and _4_! Wanna fit a model to _celebrate_?
--------------------------------------------------------------
Estimate Std. Error t value Pr(>|t|)
----------------- ---------- ------------ --------- ----------
**hp** -0.06823 0.01012 -6.742 1.788e-07
**(Intercept)** 30.1 1.634 18.42 6.643e-18
--------------------------------------------------------------
Table: Fitting linear model: mpg ~ hp
## This is a header for _4_
## This is a header for _5_
Ответ 3
Одно из решений, которое сработало для меня, предоставляется как создать цикл, который включает как кусок кода, так и текст с knitr в R. Используя Both results='asis'
и два пробела перед \n
в конце каждого цикла.
Пример:
Без двух пробелов:
```{r, results='asis'}
headers <- list("We","are","your","friends")
for (i in headers){
cat("\n##H ", i, " \n")
cat("comment",i)
}
Выход (html):
![введите описание изображения здесь]()
Как вы можете видеть, комментарии и заголовки объединяются
Решение:
С двумя пробелами: cat(" \n")
в конце цикла
for (i in headers){
cat("\n##H ", i, "\n")
cat("comment",i)
cat(" \n")# <---------------------------------
}
![введите описание изображения здесь]()
Примечание: cat(" \n")
должен быть в самом конце, он не работает, даже если вы построили или вычислили что-то в цикле.