Крючок Knitr для модального

#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)
```