Какая команда преобразует Knitr R Markdown в Markdown, удобную для Stack Exchange?

Мотивация: я часто хочу вставить результаты быстрого анализа с использованием R Markdown на сайт StackExchange. Это включает в себя R-тег при переполнении стека, Перекрестная проверка или даже анализ предметной области на таких сайтах, как Stack Exchange по когнитивным наукам (например, этот краткий анализ Индекс жизни ОЭСР данные).

Проблемы с преобразованием по умолчанию. Вывод уценки по умолчанию knitr не подходит для включения в StackExchange. Основные проблемы, которые я вижу, это то, что

  • изображения ссылаются на локальный жесткий диск
  • фрагменты кода не имеют отступа табуляции или пробела; скорее они используют Markdown в стиле github (т.е. без отступов)

То есть куски выглядят так:

```r
some code
```

и вывод выглядит так

```
## some output
## ...
```

Также могут быть рассмотрены другие конкретные вопросы, такие как

  • обеспечение правильного включения таблиц
  • обеспечение правильной передачи уравнений для сайтов, поддерживающих MathJax, таких как Cross Validated и Cognitive Science Stack Exchange.

Вопрос

Какая команда подходит для преобразования R Markdown в Markdown (или HTML), подходящую для простого добавления на сайты Stack Exchange?

Я думаю, что идеальной командой была бы однострочная команда, которая берет файл R Markdown и создает файл, в котором весь контент можно вставить непосредственно в Stack Exchange, чтобы получить хорошо отформатированный вопрос или ответ.

Я делюсь этим простым файлом rmd с парой куски кода, рисунок и уравнение в качестве тестового примера.

Первоначальные мысли: размещение изображений на imgur предположительно решит проблему с изображениями. Это можно сделать, включив следующее в файл R Markdown, но, вероятно, было бы проще, если бы эта инструкция была включена в какую-то однострочную команду.

``` {r }
opts_knit$set(upload.fun = imgur_upload) 
````

Возможно, стоит подумать, какой формат лучше использовать для вставки в StackExchange — HTML или Markdown. Пакет markdown обеспечивает большую гибкость.


person Jeromy Anglim    schedule 17.06.2012    source источник
comment
вау, приближаюсь к Университету Stack Exchange здесь. Есть ли у arXiv такая поддержка?   -  person bright-star    schedule 22.01.2014


Ответы (3)


Вот служебная функция, которая должна помочь вам начать. Он устанавливает автозагрузку в imgur, а также уценку рендеринга исходного кода с использованием вкладок вместо изолированных блоков. Вы можете улучшить эту функцию, добавив другие полезные опции.

stackify <- function(rmd_file, ...){
  require(knitr)
  opts_knit$set(upload.fun = imgur_upload) 
  render_markdown(strict = TRUE)
  out <- knit(rmd_file, ...)
  return(invisible(out))
}

ОБНОВЛЕНИЕ: я протестировал эту функцию в вашем тестовом файле, и она хорошо отображается на stats.stackexchange.com, который mathjax включен.

person Ramnath    schedule 17.06.2012
comment
Спасибо. Это работает очень хорошо. Одна вещь, которую, я думаю, можно было бы улучшить, — это количество пространства между вводом и выводом. В приведенной выше функции есть три пустые строки между командами R и выводом R, и все они отображаются как один большой фрагмент кода. Это слишком много свободного места для обмена стеками. Я думаю, что в идеале вывод на stackexchange будет выглядеть так же, как по умолчанию (т. Е. Белое поле для ввода и серое поле для вывода). По крайней мере, я думаю, что одной пустой строки между вводом и выводом достаточно. - person Jeromy Anglim; 17.06.2012
comment
Хорошая точка зрения. Я не уверен, почему появляются дополнительные новые строки. Возможно, вы захотите опубликовать это как проблему в списке рассылки knitr или на github. - person Ramnath; 17.06.2012
comment
Я не уверен, проблема в вязалке или нет. Возможно, это как-то связано с тем, как StackExchange отображает уценку. Пустые строки не имеют отступа табуляции. Итак, я полагаю, что теоретически блоки кода не должны сливаться вместе, но они делают это в StackExchange. - person Jeromy Anglim; 17.06.2012
comment
Дополнительные символы новой строки нужны для того, чтобы блоки были хорошо разделены, потому что лишние новые строки не помешают уценке. - person Yihui Xie; 17.06.2012
comment
Имеет смысл. Но это создает проблему, когда вы используете results = "asis", поскольку вместе с ним печатаются и лишние символы новой строки. - person Ramnath; 18.06.2012

Хотя я все еще хотел бы прочитать другие предложения, я взломал этот сценарий, используя ответ @Ramnath в качестве отправной точки. Он выводит фрагмент HTML, а не Markdown.

Rscript -e 'rmd_file <- dir(pattern="rmd"); md_file <- sub("rmd", "md", rmd_file); html_file <- sub("rmd", "html", rmd_file); require(methods); require(knitr); require(markdown); opts_knit$set(upload.fun = imgur_upload); knit(rmd_file); markdownToHTML(md_file, html_file, options="fragment_only") '
  • Предполагается, что в рабочем каталоге есть один файл rmd. Я полагаю, что выбор файла rmd можно было бы сделать более изощренным способом.
  • Для этого необходимо, чтобы были установлены пакеты knitr и markdown.
  • Я думаю, поскольку мы используем «Rscript», необходимо загрузить пакет methods.
  • Он загружает изображения в imgur
  • markdownToHTML экспортирует только фрагмент кода в виде html-файла. Затем содержимое этого файла можно скопировать в ответ Stack Exchange.

Результат выглядит неплохо. Он преодолевает проблему чрезмерных пустых строк. Однако вывод не является уценкой, что затрудняет редактирование результата.

person Jeromy Anglim    schedule 17.06.2012

RStudio использует pandoc, поэтому вы можете указать вариант уценки, подходящий для ваших нужд. В начале файла .Rmd:

---
output:
  md_document:
    variant: markdown_strict+autolink_bare_uris
---

Затем вы сможете скопировать/вставить содержимое полученного файла в StackExchange.

См.: http://rmarkdown.rstudio.com/markdown_document_format.html#markdown-variants

person kmcital    schedule 27.09.2014