Свертывание кода для отдельных фрагментов в R Markdown?

Есть ли способ иметь сворачивание кода для отдельных фрагментов в документе R Markdown, но не в других (без написания настраиваемого JavaScript)?

Я знаю, что могу использовать code_folding YAML code_folding, но это относится ко всему документу. Я бы хотел включить его для отдельных кусков, но не для всех кусков.

[Причина в написании лаборатории, в которой содержатся инструкции, которые не должны быть скрытыми, но с вопросами, которые имеют решения show/hide.]

Ответы

Ответ 1

После rmarkdown 1.15

Это было реализовано (см. связанные проблемы, PR и NEWS.md). Однако вы должны заметить, что это сворачивает только код, а не вывод. Вам нужно добавить дополнительные настройки, чтобы скрыть код по умолчанию и не оценивать его.

---
title: "Bohemian Rhapcodey"
output: 
  html_document:
    code_folding: hide
---

## Question 1

Are you in love with your car?

'''{r class.source = NULL, eval = FALSE}
summary(cars)
'''

## Question 2

Are you under pressure?

'''{r class.source = NULL, eval = FALSE}
plot(pressure)
'''

Попробуйте вязаный HTML в JSFiddle

До rmarkdown 1.15

Вопрос был закрыт в июле 2019 года на GitHub. Обходной путь с использованием элемента details в html был предложен.

Это может работать в некоторых случаях, пока не будет реализовано.

---
title: "Bohemian Rhapcodey"
output: html_document
---

## Question 1

Are you in love with your car?

<details>
  <summary>Toggle answer</summary>
  '''{r cars}
  summary(cars)
  '''
</details>

## Question 2

Are you under pressure?

<details>
  <summary>Toggle answer</summary>
  '''{r pressure}
  plot(pressure)
  '''
</details>

Попробуйте вязаный HTML на JSFiddle

Ответ 2

Обходной путь с использованием элемента details работает хорошо, но для улучшения возможности обнаружения я бы порекомендовал добавить некоторый код, чтобы пользователь мог видеть указывающую руку, когда он/она наводит курсор на элемент. Это делает более очевидным, что элемент является интерактивным. Расширение на примере 7hibault:

<style type="text/css">
details:hover { cursor: pointer }
</style>

---
title: "Bohemian Rhapcodey"
output: html_document
---

## Question 1

Are you in love with your car?

<details>
  <summary>Toggle answer</summary>
  '''{r cars}
  summary(cars)
  '''
</details>

Ответ 3

"Это не моя охота за репутацией, но я не хочу, чтобы люди соглашались с тем, что что-то невозможно"

Теперь, из источника в комментарии @Frank: github.com/rstudio/rmarkdown/issues/664, есть два рабочих места и альтернативы:

Во-первых, используя детали; автор: jeff-goldsmith

   <details>
   <summary>Copyright 1999-2018.</summary>
   <p> - by Refsnes Data. All Rights Reserved.</p>
   <p>All content and graphics on this web site are 
    the property of the company Refsnes Data.</p>
    </details>

https://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_details

Во-вторых, по mbojan

Я играл с этим, чтобы иметь возможность сбрасывать только источник фрагмента кода вэнь с использованием формата вывода github_document. Возможно, если вы переопределите выходной вывод с помощью:

   knitr::knit_hooks$set(
   source = function(x, options) {
   hook.r = function(x, options) {
   fence <- "'''"
    language = tolower(options$engine)
    if (language == 'node') language = 'javascript'
    if (!options$highlight) language = 'text'
    if(!is.null(options$foldcode)) {
    paste0('\n\n', "<details> 
    <summary>Source</summary>\n", fence, 
     language, '\n', x, fence,  '\n\n', "</details>\n")
     } else {
          paste0('\n\n', fence, language, '\n', x, fence,  
     '\n\n')
    }
    }
    x = knitr:::hilight_source(x, 'markdown', options)
    hook.r(
   paste(c(
    x, 
    ''
    ), collapse = '\n'), 
   options
   )
   }
  )




  and then in Rmd, say:



     '''{r, foldcode=TRUE}
     data.frame(x=1:5)
     knitr::kable(d)
     '''

Это взломать, потому что вышеприведенный крючок не уважает среду, созданную при вызове render_markdown() - привязки по умолчанию зависят от объектов вне функций hook и их аргументов, а именно: функции hook.t и hook.r, а объекты строгие, забор и fence_char. Крючок выше в основном определяет /hardcodes, которые находятся внутри самого крючка.