#html #r #r-markdown #bootstrap-modal #knitr
#HTML #r #r-уценка #bootstrap-модальный #knitr
Вопрос:
Можно ли создать модальный на основе крючка? Reprex R уценка:
---
title: "Modal hook"
output: html_document
---
```{r setup, include=FALSE}
library(bsplus)
library(htmltools)
library(knitr)
knit_hooks$set(modal = function(before, options, envir) {
# ???
})
```
This chunk creates a modal window
```{r, echo=FALSE}
title <- "Test"
text = "Some text."
{
sink("tmp.md")
cat('n```rnc(1,1)n```', sep="")
cat('n', text)
sink()
}
id <- "m1"
tagList(bs_modal(id = id, title = title, body = includeMarkdown("tmp.md")),
bs_button(title) %>% bs_attach_modal(id_modal = id))
```
Можно ли создать крючок, который делает то же самое:
```{r, modal = TRUE, title = "Test", text = "Some text."}
c(1,1)
```
Также должен работать с графиками:
```{r, modal = TRUE, title = "Test", text = "Some text."}
plot(1:10)
```
По сути, весь вывод фрагмента должен быть помещен в модальный, а не в документ if modal = TRUE
.
Вопрос в том, как определить крючок, чтобы сделать его первым фрагментом.
Комментарии:
1. Я думаю, вам нужно изменить выходные крючки для этого; одного нового крючка для фрагмента будет недостаточно. Смотрите yihui.org/knitr/hooks .
Ответ №1:
Кажется, работает следующее
```{r setup, include=FALSE}
library(bsplus)
library(htmltools)
library(knitr)
# generate a random id
opts_hooks$set(modal = function(options) {
if (isTRUE(options$modal)) {
options$str_id <- stringi::stri_rand_strings(1, 20)
}
options
})
knit_hooks$set(modal = function(before, options, envir) {
if (before) {
paste0('n<div class="modal fade" id="', options$str_id, '" tabindex="-1" role="dialog" aria-labelledby="m2-title">',
'<div class="modal-dialog" role="document">',
'<div class="modal-content">',
'<div class="modal-header">',
'<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>',
'<h4 class="modal-title" id="', options$str_id, '-title">', options$title, '</h4>',
'</div><div class="modal-body">')
} else {
paste0('<p>', options$text, '</p></div>',
'<div class="modal-footer"><button class="btn btn-default" data-dismiss="modal">Close</button></div>',
'</div></div></div>',
'<button class="btn btn-default" data-toggle="modal" data-target="#', options$str_id, '">', options$title, '</button><br/>n')
}
})
```
Теперь модалы можно создавать с помощью:
```{r, modal = TRUE, title = "No code", echo=FALSE}
1:4
```
```{r, modal = TRUE, title = "A plot", text = "Some text."}
plot(1:10)
```