6

私はR ノートブックで作業しており、それを使用して HTML ドキュメントと PDF ドキュメントの 2 つの出力を作成したいと考えています。

私の分析にはリーフレット マップ (html ウィジェット) が含まれており、ノートブックを PDF ドキュメントに編むときに問題が発生していますwebshotパッケージに含まれるようになった機能のおかげでknitr、「knitr は webshot パッケージを使用して HTML ウィジェットの静的スクリーンショットを自動的に生成しようとします」 ( https://github.com/yihui/knitr/blob/master/NEWS.md )。

これは、出力が一連のリーフレット マップが互いに積み上げられたものである場合にうまく機能しますが、より簡潔な行配置でマップをグループ化したいと考えています (下の画像を参照)。

スクリーンショット

私の R ノートブックの再現可能な例を次に示します

残念ながら、これを 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>

out.extraLaTeX は CSS の処理方法を認識していないため、chunk オプションを使用してこの CSS スニペットを追加しようとしても機能しません。ただし、pdf にコンパイルすると JS コードは無視されます。

ここに画像の説明を入力

于 2016-09-18T22:40:20.393 に答える
3

選択した回答で問題は解決しましたが、少し異なるアプローチを取ることにしました。

私はまだ CSS スタイルを調整しますが、すべての要素を対象とする JS スクリプトを使用する代わりに、CSS を個別に調整する.leafletというヘルパー関数に各リーフレット htmlwidget を渡しました。styleWidgetこの関数は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 のソリューションが改善されます。たとえば、float: none;次の要素がマップの横に表示されないように、3 番目のマップのスタイルを に変更できるようになりました。このstyleWidget関数を使用して任意のhtmlwidget (ただし Shiny ウィジェットを除く) の CSS を変更できるため、ツールボックスに含めるのに適した汎用ツールになります。

于 2016-09-21T04:54:53.830 に答える