Подтвердить что ты не робот

Генерировать комментарии по меткам внутри цикла

Я пытаюсь создать отчет 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. Возможно ли это?

Спасибо, Питер

4b9b3361

Ответ 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_?

--------------------------------------------------------------
     &nbsp;        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") должен быть в самом конце, он не работает, даже если вы построили или вычислили что-то в цикле.