2016-09-18 1 views
5

Ich arbeite in einem R notebook und möchte es verwenden, um zwei outputs zu erstellen: ein HTML-Dokument und ein PDF-Dokument.HTML-Widgets in einem RMarkdown-Dokument (PDF, HTML) anordnen

Meine Analyse enthält Broschüren (HTML-Widgets), die Probleme verursacht, wenn ich das Notebook zu einem PDF-Dokument stricken. Dank der Funktion webshot, die jetzt im Paket knitr enthalten ist, wird "knitr versuchen, statische Screenshots für HTML-Widgets automatisch mit dem Webshot-Paket zu erstellen" (https://github.com/yihui/knitr/blob/master/NEWS.md).

Dies funktioniert gut, wenn meine Ausgabe eine Reihe von Flugblättern Karten übereinander gestapelt ist, aber ich würde die Karten in einer prägnanten Reihenanordnung zusammen gruppieren (siehe Bild unten).

screenshot

Hier ist ein reproduzierbares Beispiel meines R Notebook: gist

Leider, wenn ich versuche, dieses Dokument in eine PDF zu stricken ich folgende Fehlermeldung:

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. 

Wie kann ich diese einreihige Anordnung in einem PDF-Dokument erhalten?

Antwort

4

Wenn ich Sie richtig verstehe, dann müssen Sie nur einige Chunk-Optionen hinzufügen. Der Schlüssel hier ist die Option fig.show='hold', die bestimmt, dass alle Plots in dem Chunk gesammelt werden und am Ende des Chunk zusammen angezeigt werden.

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

Wenn Sie für PDF- und HTML-Ausgabe dieses Format haben Sie dieses Skript an den Körper ofyour Rmd Dokument (nicht in einem Stück) hinzufügen könnte:

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

Der Versuch, diese CSS hinzufügen Snippet über die Chunk-Option out.extra funktioniert nicht, da LaTeX nicht mit CSS umgehen kann. Obwohl der JS-Code ignoriert wird, wenn er nach PDF kompiliert wird.

enter image description here

+0

Dies ist genau die PDF-Ausgabe, nach der ich gesucht habe! Leider zeigt jetzt die HTML-Ausgabe die Karten im gestapelten Format an. Gibt es eine Möglichkeit, das Beste aus beiden Welten zu haben?, beide pdf und html Dokumente zeigen die Karten in einer einreihigen Anordnung)? – Tiernan

+0

Ich gab es eine Chance. Meine Antwort wurde aktualisiert. –

+0

Fügen Sie das Skript dem R-Chunk hinzu? Zu einem js Stück? – Tiernan

2

Während die gewählte Antwort mein Problem habe zu lösen, habe ich einen etwas anderen Ansatz nehmen entschieden.

Ich passe immer noch das CSS-Styling an, aber anstatt ein JS-Skript zu verwenden, das alle .leaflet Elemente anzielt, übergab ich jedes Faltblatt htmlwidget an eine Hilfsfunktion namens styleWidget, die das CSS individuell anpasst. Diese Funktion wird erklärt here, aber ich werde unten sowieso seine Definition hinzu:

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

Diese auf Martins Lösung verbessert, weil es mehr Kontrolle gibt - zum Beispiel, kann ich jetzt die dritte Karte des Gerstenkorn zu float: none; so dass die Änderung Folgende Elemente werden nicht neben den Karten angezeigt. Die styleWidget Funktion kann verwendet werden, um die CSS von beliebig htmlwidget zu modifizieren (obwohl nicht Shiny Widgets), so dass es ein gutes Allzweck-Tool in der Toolbox zu haben.