Свертывание кода для отдельных фрагментов в 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, которые находятся внутри самого крючка.