2016-08-07 4 views
3

Я использую/Возможность генерации HTML-кода для некоторых блогов. Я нашел его чрезвычайно полезным и удобным, но в последнее время некоторые проблемы с размером файла.knitr HTML-вывод слишком большой

Когда я вязал скрипт с графикой, использующей шейп-файлы или ggmap изображений, html-файл становится слишком большим для хоста блога, чтобы понять его (я пробовал как с блоггером, так и с wordpress). Я считаю, что это связано с относительно большими файлами data.frames/files, которые являются шейп-файлами/ggmap, помещаемыми в html-форму. Есть ли что-нибудь, что я могу сделать, чтобы получить меньший файл html, который может быть проанализирован хостом блога?

Для справки: вывод html из сценария rmarkdown с одним графическим изображением с использованием слоя ggmap, слоя шейп-файлов и некоторых данных составляет 1,90 МБ, что слишком велико для блоггера или Wordpress для обработки в входе html. Спасибо за любые идеи.

ответ

0

Единственное, что вы могли бы сделать, это не использовать встроенное изображение и другие ресурсы. Для достижения этой цели, вы можете установить self_contained опцию в заголовке YAML для вашего документа false, например:

--- 
output: 
    html_document: 
    self_contained: false 
--- 

Больше информации здесь: http://rmarkdown.rstudio.com/html_document_format.html

+0

Есть ли способ встраивать изображения, но не все остальное (как и все точки данных и т. Д.)? Не уверен, что они могут быть разделены действительно, но это было бы идеально. Спасибо за точку в этом направлении. – moman822

+0

Что вы имеете в виду, когда говорите о точках данных? Когда вы создаете документ knitr/RMarkdown, единственное, что входит в HTML, - это текст/код в документе и все, что напечатано или построено. Таким образом, если вы явно не печатаете рамку данных на экране, сами точки данных будут отображаться косвенно только на ваших графиках. Если вы используете SVG или что-то подобное, изображения будут большими, поскольку они сохраняют каждый datapoint, но если вы используете только значения по умолчанию (PNG), это не должно быть проблемой. –

+0

Я думал, что содержимое каждого кадра данных каким-то образом хранится в вязаном html, например, html-код - это весь процесс выполнения вычислений и т. Д. Я думал только об этом, потому что html-файл значительно больше, чем документ вязаного слова. Ясно, что я не очень хорошо знаком с этими внутренними разработками или с html, поэтому спасибо за вашу помощь. – moman822

2

Ниже 3 различных вариантов, чтобы помочь вам уменьшить размер файла файлов HTML с кодированными изображениями.


1. Оптимизировать существующий HTML файл

Вы можете запустить this Python script на существующий HTML-файл. Сценарий:

  • Декодирование base64 кодированные изображения
  • запустить pngquant, чтобы оптимизировать изображения
  • перекодировать оптимизированные изображения как base64

Использование:

python optimize_html.py infile.html 

Он записывает вывод в infile-optimized.html.


2. Используйте встроенный knitr крюк для оптимизации PNG изображения

knitr 1,15 включает в себя крючок под названием hook_optipng, который будет запускать программу optipng на сгенерированных файлов PNG, чтобы уменьшить размер файла.

Вот .Rmd пример (взято из: knitr-examples/035-optipng.Rmd):

# 035-optipng.Rmd 

This demo shows you how to optimize PNG images with `optipng`. 

```{r setup} 
library(knitr) 
knit_hooks$set(optipng = hook_optipng) 
``` 

Now we set the chunk option `optipng` to a non-`NULL` value, 
e.g. `optipng=''`, to activate the hook. This string is passed to 
`optipng`, so you can use `optipng='-o7'` to optimize more heavily. 

```{r use-optipng, optipng=''} 
library(methods) 
library(ggplot2) 
set.seed(123) 
qplot(rnorm(1e3), rnorm(1e3)) 
``` 

3. Напишите свой knitr крюк для любого изображения оптимизатора

Writing your own hook тоже довольно легко, поэтому я написал крюк, который вызывает программу pngquant.Я нахожу, что pngquant работает быстрее, а выходные файлы меньше и выглядят лучше.

Вот пример .R, который определяет и использует hook_pngquant (взято из this gist).

#' --- 
#' title: "pngquant demo" 
#' author: "Kamil Slowikowski" 
#' date: "`r Sys.Date()`" 
#' output: 
#' html_document: 
#'  self_contained: true 
#' --- 

#+ setup, include=FALSE 
library(knitr) 

# Functions taken from knitr/R/utils.R 
all_figs = function(options, ext = options$fig.ext, num = options$fig.num) { 
    fig_path(ext, options, number = seq_len(num)) 
} 
in_dir = function(dir, expr) { 
    if (!is.null(dir)) { 
    owd = setwd(dir); on.exit(setwd(owd)) 
    } 
    wd1 = getwd() 
    res = expr 
    wd2 = getwd() 
    if (wd1 != wd2) warning(
    'You changed the working directory to ', wd2, ' (probably via setwd()). ', 
    'It will be restored to ', wd1, '. See the Note section in ?knitr::knit' 
) 
    res 
} 
is_windows = function() .Platform$OS.type == 'windows' 
in_base_dir = function(expr) { 
    d = opts_knit$get('base.dir') 
    if (is.character(d) && !file_test('-d', d)) dir.create(d, recursive = TRUE) 
    in_dir(d, expr) 
} 

# Here is the code you can modify to use any image optimizer. 
hook_pngquant <- function(before, options, envir) { 
    if (before) 
    return() 
    ext = tolower(options$fig.ext) 
    if (ext != "png") { 
    warning("this hook only works with PNG") 
    return() 
    } 
    if (!nzchar(Sys.which("pngquant"))) { 
    warning("cannot find pngquant; please install and put it in PATH") 
    return() 
    } 
    paths = all_figs(options, ext) 
    in_base_dir(lapply(paths, function(x) { 
    message("optimizing ", x) 
    cmd = paste(
     "pngquant", 
     if (is.character(options$pngquant)) options$pngquant, 
     shQuote(x) 
    ) 
    message(cmd) 
    (if (is_windows()) 
     shell 
     else system)(cmd) 
    x_opt = sub("\\.png$", "-fs8.png", x) 
    file.rename(x_opt, x) 
    })) 
    return() 
} 

# Enable this hook in this R script. 
knit_hooks$set(
    pngquant = hook_pngquant 
) 

#' Here we set the chunk option `pngquant='--speed=1 --quality=0-50'`, 
#' which activates the hook. 

#+ use-pngquant, pngquant='--speed=1 --quality=0-50' 
library(methods) 
library(ggplot2) 
set.seed(123) 
qplot(rnorm(1e3), rnorm(1e3)) 

Я предпочитаю писать свои отчеты в сценариях R (.R) вместо уценки документов R (.Rmd). См. http://yihui.name/knitr/demo/stitch/ для получения дополнительной информации о том, как это сделать.

Смежные вопросы