我正在使用R notebook并希望用它来创建两个ouptuts:HTML文档和PDF文档。
我的分析包括传单地图(html小部件),当我将笔记本编织成PDF文档时会导致问题。感谢knitr
包中现在包含的webshot
函数,“knitr将尝试使用webshot包”(https://github.com/yihui/knitr/blob/master/NEWS.md)自动生成HTML小部件的静态屏幕截图。
当我的输出是一系列相互叠加的传单地图时,这可以正常工作,但我想以更简洁的行排列将地图组合在一起(见下图)。
以下是我的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文档中获得此单行排列?
答案 0 :(得分: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选项out.extra
添加此CSS代码段不起作用,因为LaTeX不知道如何处理CSS。虽然编译为pdf时忽略了JS代码。
答案 1 :(得分:3)
虽然选定的答案确实解决了我的问题,但我决定采取稍微不同的方法。
我仍然调整CSS样式,但是我没有使用针对所有.leaflet
元素的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
)
)
)
}
这改进了Martin的解决方案,因为它提供了更多控制 - 例如,我现在可以将第三个地图的stye更改为float: none;
,以便在地图旁边不显示以下元素。 styleWidget
函数可用于修改任何 htmlwidget的CSS(尽管不是Shiny小部件),使其成为工具箱中的通用工具。