6

我在R 笔记本上工作,想用它来创建两个输出:一个 HTML 文档和一个 PDF 文档。

我的分析包括传单地图(html 小部件),当我将笔记本编织成 PDF 文档时,这会导致问题。由于webshot现在包含在knitr包中的功能,“knitr 将尝试使用 webshot 包自动为 HTML 小部件生成静态屏幕截图”(https://github.com/yihui/knitr/blob/master/NEWS.md)。

当我的输出是一系列堆叠在一起的传单地图时,这很好用,但我想以更简洁的行排列将这些地图组合在一起(见下图)。

截屏

这是我的 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

2 回答 2

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 输出都具有这种格式,您可以将此脚本添加到 Rmd 文档的正文中(而不是在块内):

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

尝试通过 chunk 选项添加这个 CSS 片段out.extra是行不通的,因为 LaTeX 不知道如何处理 CSS。虽然 JS 代码在编译为 pdf 时会被忽略。

在此处输入图像描述

于 2016-09-18T22:40:20.393 回答
3

虽然选择的答案确实解决了我的问题,但我决定采取稍微不同的方法。

我仍然调整 CSS 样式,但我没有使用针对所有.leaflet元素的 JS 脚本,而是将每个传单 htmlwidget 传递给一个称为styleWidget单独调整 CSS 的辅助函数。这里解释了这个函数,但无论如何我都会在下面添加它的定义:

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
                        )
                )
        )
}

这改进了 Martin 的解决方案,因为它提供了更多控制权——例如,我现在可以将第三张地图的样式更改为,float: none;以便地图旁边不会显示以下元素。该styleWidget函数可用于修改任何htmlwidget(尽管不是 Shiny 小部件)的 CSS,使其成为工具箱中一个很好的通用工具。

于 2016-09-21T04:54:53.830 回答