2016-09-18 4 views
5

Я работаю в R notebook и хотел бы использовать его для создания двух файлов: документа HTML и документа PDF.Как разместить HTML-виджеты внутри документа RMarkdown (PDF, HTML)

Мой анализ включает в себя карты буклетов (html-виджеты), которые вызывает проблемы, когда я вставляю ноутбук в документ PDF. Благодаря функции webshot, которая теперь включена в пакет knitr, «knitr попытается автоматически создавать статические скриншоты для виджетов HTML автоматически с помощью пакета веб-снимков» (https://github.com/yihui/knitr/blob/master/NEWS.md).

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

screenshot

Вот воспроизводимый пример моего R ноутбука: gist

К сожалению, когда я пытаюсь связать это документ PDF, я получаю следующее сообщение об ошибке:

Error: Functions that produce HTML output found in document targeting latex output. 
Please change the output type of this document to HTML. Alternatively, you can allow 
HTML output in non-HTML formats by adding this option to the YAML front-matter of 
your rmarkdown file: 

    always_allow_html: yes 

Note however that the HTML output will not be visible in non-HTML formats. 

Как могу ли я получить это однострочное расположение в PDF-документе?

ответ

4

Если я правильно вас понимаю, то все, что вам нужно сделать, это добавить некоторые варианты блоков. Ключом здесь является опция fig.show='hold', которая определяет, что все графики в куске будут собраны и отображаются вместе в самом конце куска.

--- 
title: "R Notebook" 
output: 
    pdf_document: 
    keep_tex: yes 
    html_notebook: default 
--- 

###Default Arrangement 
```{r, echo=FALSE,message=FALSE, fig.height=4, fig.width=2, fig.show='hold'} 
#devtools::install_github("wch/webshot") 

library(leaflet) 
library(htmltools) 
library(RColorBrewer) 

m1 <- leaflet(quakes) %>% 
     addTiles() %>% 
     addMarkers(lng=174.768, lat=-36.852) 

m2 <- leaflet(quakes) %>% 
     addProviderTiles("Esri.WorldGrayCanvas") %>% 
     addMarkers(lng=174.768, lat=-36.852) 

m3 <- leaflet(quakes) %>% 
     addProviderTiles("Stamen.Toner") %>% 
     addMarkers(lng=174.768, lat=-36.852) 
m1 
m2 
m3 
``` 

Если вы хотите, чтобы этот формат как PDF и HTML вывода можно добавить этот скрипт к телу ofyour RMD документа (а не внутри куска):

<script> 
    $(document).ready(function() { 
    $('.leaflet').css('float','left'); 
    }); 
</script> 

Попытка добавить CSS snippet через опцию chunk out.extra не работает, поскольку LaTeX не знает, как бороться с CSS. Хотя код JS игнорируется при компиляции в pdf.

enter image description here

+0

Это как раз вывод PDF, который я искал! К сожалению, теперь вывод HTML отображает карты в сложном формате. Есть ли способ получить лучшее из обоих миров здесь (т., как в pdf, так и в html-документах отображаются карты в однострочном расположении)? – Tiernan

+0

Я выстрелил. Обновлен мой ответ. –

+0

Добавьте скрипт к фрагменту R? В js кусок? – Tiernan

2

Хотя выбранный ответ сделал решить мою проблему, я решил взять несколько иной подход.

Я все еще настраиваю стиль CSS, но вместо использования JS-скрипта, который нацелен на все элементы .leaflet, я передал каждый листовой htmlwidget вспомогательной функции под названием styleWidget, которая настраивает CSS отдельно. Эта функция объясняется here, но я добавлю его определение ниже в любом случае:

styleWidget <- function(hw=NULL, style="", addl_selector="") { 
     stopifnot(!is.null(hw), inherits(hw, "htmlwidget")) 

     # use current id of htmlwidget if already specified 
     elementId <- hw$elementId 
     if(is.null(elementId)) { 
       # borrow htmlwidgets unique id creator 
       elementId <- sprintf(
         'htmlwidget-%s', 
         htmlwidgets:::createWidgetId() 
       ) 
       hw$elementId <- elementId 
     } 

     htmlwidgets::prependContent(
       hw, 
       htmltools::tags$style(
         sprintf(
           "#%s %s {%s}", 
           elementId, 
           addl_selector, 
           style 
         ) 
       ) 
     ) 
} 

Это улучшает решение Мартина, потому что это дает больше контроля - например, теперь я могу изменить ячмень третьего отображения на float: none; так, что следующие элементы не отображаются рядом с картами. Функция styleWidget может быть использована для изменения CSS любого htmlwidget (хотя это и не Блестящие виджеты), что делает его хорошим универсальным инструментом для использования в панели инструментов.