Подтвердить что ты не робот

Как захватить R текст + вывод изображения в один файл (html, doc, pdf и т.д.)?

Задача состоит в том, чтобы создать файл (word, rtf, pdf, html или что-то еще), который будет захватывать вывод R (например: не код, создавший выход), в этот формат (включая текст и).

Способ сделать это должен включать как можно меньше изменений в исходное R script.

Если бы я интересовался только текстом или изображениями, я бы использовал? sink или? pdf. Но я не знаю, как легко объединить два в один вывод.

Я знаю, что есть способ экспортировать R-выход с использованием r2wd, но он включает слишком много медалей в исходном коде для моего вкуса (я предполагаю, что то же самое верно для решения sweave, хотя у меня нет опыта в этом, чтобы сказать)

Вот пример кода для будущих примеров:

START.text.and.image.recording("output.file") # this is the function I am looking for
x <- rnorm(100)
y <- jitter(x)
print(summary(x))
print(head(data.frame(x,y)))
cor(x,y)
plot(x,y)
print(summary(lm(y~x)))
STOP.text.and.image.recording("output.file") # this is the function I am looking for

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

Причины:

  • Я еще не знаю LaTeX
  • Даже зная LaTeX, я хочу, чтобы что-то с простыми значениями по умолчанию просто давало все выходы вместе и в порядке. "просто" означает - как можно меньше дополнительных накладных расходов на управление кодом/файлом.

Я понимаю, что что-то вроде sweave или brew более масштабируемо, но я смотрю, есть ли более "простое" решение для небольших проектов/скриптов.

4b9b3361

Ответ 1

Начиная с 2012 года knitr обеспечивает идеальное решение этой проблемы.

Например, создайте файл с расширением rmd. Оберните свой код в пару команд следующим образом:

```{r}
x <- rnorm(100)
y <- jitter(x)
print(summary(x))
print(head(data.frame(x,y)))
cor(x,y)
plot(x,y)
print(summary(lm(y~x)))
```

Вы можете преобразовать его в автономный HTML файл несколькими способами. В RStudio вы просто нажимаете одну кнопку Knit HTML. Это HTML файл, созданный; чтобы фактически просмотреть, как HTML отображается в браузере, сохранить файл и открыть его.

Код изображения и вывод переплетены, как вы могли ожидать.

Конечно, вы можете и обычно делить файл на несколько фрагментов кода R. Но дело в том, что вам не нужно.

Вот еще несколько примеров, которые я создал:

Ответ 2

Если вы знаете LaTeX, sweave, скорее всего, будет вашим лучшим выбором. odfWeave - аналогичный механизм, но для встраивания кода в файл OpenOffice.org. Для HTML есть пакет R2html. Но все, скорее всего, потребует от вас немного сломать код, чтобы получить максимальную отдачу от систем. В качестве альтернативы, ваш шаблон sweave/odfweave/html может генерировать аспекты создания данных script в одном блоке кода, при этом отображаемый вывод (print() statements) помещается там, где это необходимо. Ваша графика также может быть вызвана в script, чтобы создать фигуры для вставки в документ в виде отдельных файлов, которые вы затем включаете вручную в шаблон.

Например (и это не полный файл .Rnw для запуска через sweave) в sweave файле, вы бы поставили что-то вроде этого в шаблоне, который выделяет основную часть R script, который будет выполнять анализ и генерировать объекты R:

<<run_script, eval=TRUE, echo=FALSE, results=hide>>=
source("my_script.R")
@

Затем вам нужно будет вставить фрагменты кода, где вы хотите напечатать вывод:

<<disp_output, eval=TRUE, echo=FALSE, results=verbatim>>=
## The results=verbatim is redundant as it is the default, as is eval=TRUE
print(summary(x)) ## etc
@

Затем вам понадобятся куски для вставки цифр.

Разделение вашего кода анализа на результат (распечатка и/или цифры), вероятно, является хорошей практикой, особенно если код анализа является дорогостоящим в вычислительных терминах. Вы можете запускать его один раз или даже кэшировать его - при обновлении кода вывода/отображения, как вам нужно.

Пример файла Sweave

Используя csgillespie пример sweave файла, я бы установил все так. Сначала файл my_script.R, содержащий код анализа ядра:

x <- rnorm(100)
y <- jitter(x)
corXY <- cor(x,y)
mod.lm <- lm(y~x)

Затем файл Sweave

\documentclass[12pt]{article}
\usepackage{Sweave}
\begin{document}

An introduction
<<run_analysis, eval=TRUE,echo=FALSE, results=hide>>=
source("my_script.R")
@

% Later
Here are the results of the analysis
<<show_printed_output, echo=FALSE>>=
summary(x))
head(data.frame(x,y))
@

The correlation between \texttt{x} and \texttt{y} is:
<<print_cor, echo=FALSE>>=
corXY
@

Now a plot
\begin{figure}[h]
    \centering
<<echo=FALSE, eval=TRUE, fig=TRUE, width=6, height=4>>=
plot(x,y)
@ 
\caption{\textit{A nice plot.}}
\end{figure}

\end{document}

То, что вам кажется желающим, не существует; простой способ объединения R-кода и вывода в файл документа. То есть, если вы не считаете, что sweave и т.д. Просто. Вам может потребоваться переосмыслить, что вы хотите сделать, или как вы упорядочиваете свой анализ, графику и код вывода, но вам, скорее всего, лучше всего воспользоваться одним из предложенных вариантов (sweave, odfweave, brew, R2html).

НТН

Ответ 3

Я бы посоветовал вам использовать Sweave, но элементарная функциональность, которая не очень хороша, может быть достигнута с помощью sink().

Обычный файл txt:

sink(file = "test.txt", type = "output")
summary(cars)
sink()

или добавить некоторые теги HTML:

sink(file = "tal_test.html", type = "output")
cat("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"", "\n")
cat("\"http://www.w3.org/TR/html4/strict.dtd\">", "\n")
        cat("<HTML>", "\n")
        cat("<HEAD>", "\n")
        cat("<TITLE>My first HTML document</TITLE>", "\n")
        cat("</HEAD>", "\n")
        cat("<BODY>", "\n")
        summary(cars)
        cat("</BODY>", "\n")
        cat("</HTML>", "\n")
sink()

Ответ 4

Вы упомянули sweave в своем вопросе, но не совсем, почему это не подходит. Ваш вопрос кажется идеальным для Sweave. Фактически, ваш примерный код мог быть получен из второго Sweave example.

Пример файла Sweave

Если вы знаете Латекс, то Sweave не так уж сложно. Здесь ваш пример файла в виде файла Sweave:

\documentclass[12pt,BCOR3mm,DIV16]{scrreprt}
\usepackage{Sweave}
\begin{document}

An introduction
<<eval=TRUE,echo=TRUE>>=
x <- rnorm(100)
y <- jitter(x)
print(summary(x))
print(head(data.frame(x,y)))
cor(x,y)
@ 
Now a plot
\setkeys{Gin}{width=0.5\textwidth}
\begin{figure}[h]
    \centering
<<echo=FALSE, eval=TRUE, fig=TRUE, width=6, height=4>>=
plot(x,y)
@ 
\caption{\textit{A nice plot.}}
\end{figure}

\end{document}

Под linux просто сохраните файл как tmp.Rnw. Тогда

R CMD Sweave tmp.Rnw
pdflatex tmp.tex

Ответ 5

Существует также LyX, который имеет интерфейс Sweave. Код интерфейса R/LyX/Sweave находится на CRAN по адресу http://cran.fhcrc.org/contrib/extra/lyx/. Сам LyX находится в большинстве дистрибутивов Linux. Все это волшебство может быть сделано для работы в Windows, но это определенно нетривиально. В Windows я бы рекомендовал Inference for R из Blue Reference для грамотного програмирования R.

Ответ 6

Хорошо, я просто напоминаю, что я использовал Asciidoc для короткой публикации или редактирования веб-страницы. Теперь есть R плагин (ascii на CRAN), что позволяет вставлять R-код в документ asciidoc. Синтаксис очень похож на Markdown или Textile, поэтому вы научитесь его очень быстро.

Вывод: (X) HTML, Docbook, LaTeX и, конечно, PDF через один из двух последних бэкэндов.

К сожалению, я не думаю, что вы можете превратить весь свой код в один оператор. Однако он поддерживает большое количество объектов R, см. Ниже.

> methods(ascii)
 [1] ascii.anova*              ascii.aov*                ascii.aovlist*            ascii.cast_df*           
 [5] ascii.character*          ascii.coxph*              ascii.CrossTable*         ascii.data.frame*        
 [9] ascii.default*            ascii.density*            ascii.describe*           ascii.describe.single*   
[13] ascii.factor*             ascii.freqtable*          ascii.ftable*             ascii.glm*               
[17] ascii.htest*              ascii.integer*            ascii.list*               ascii.lm*                
[21] ascii.matrix*             ascii.meanscomp*          ascii.numeric*            ascii.packageDescription*
[25] ascii.prcomp*             ascii.sessionInfo*        ascii.simple.list*        ascii.smooth.spline*     
[29] ascii.summary.aov*        ascii.summary.aovlist*    ascii.summary.glm*        ascii.summary.lm*        
[33] ascii.summary.prcomp*     ascii.summary.survfit*    ascii.summary.table*      ascii.survdiff*          
[37] ascii.survfit*            ascii.table*              ascii.ts*                 ascii.zoo*               

   Non-visible functions are asterisked

Ответ 7

Это в свете ромуновского ответа, но все же. Вы можете просто написать собственный распечаток, который завершает вывод в некотором форматировании HTML и вставляет вывод в HTML файл. То же самое можно сделать с изображениями с схемой URI данных, например, используя функцию img из base64 R.

Ответ 8

Я написал script Roux около года назад, который делает это. Я хотел иметь возможность создавать транскрипты HTML из запуска R script, включая любые изображения, без необходимости менять script.

Вы вызываете Roux из командной строки, например: пример roux.R

и roux будет:

  • запустите script в R (сначала требуется пакет Roux) Синтаксис
  • выделяет вывод .Rout с использованием Pygments.
  • вставить изображения в нужное место

пакет Roux R представляет собой очень маленький пакет R, который модифицирует plot() и некоторые другие функции для автоматической записи в произвольное имя файла, а не для интерактивного графического устройства по умолчанию.

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

Так как разговаривая с Тальом об этом, я обновил и улучшил код, и теперь он здесь: http://bitbucket.org/ananelson/roux/src

поэтому, если вы столкнетесь с какими-либо проблемами, сообщите об этом трекеру проблемы на Bitbucket.

Я добавил поддержку транскриптов LaTeX, чтобы вы могли легко создавать PDF файлы, в которых есть расшифровка вашего R script, включая изображения. (Вы можете увидеть пример, если вы посмотрите в каталоге example-output, найдите ссылку "raw", чтобы загрузить его.)

Вам нужно иметь Python и библиотеку python Pygments. Если у вас установлена ​​более старая версия Python и возникают какие-либо проблемы, сообщите мне.

Я писал о Roux в своем блоге, но не публиковал его так, потому что мои усилия были сосредоточены на новом проекте под названием Dexy, который предназначен для замены Sweave. Если вы хотите больше гибкости и контроля или заинтересованы в грамотной документации, вы также можете проверить Dexy.

Ответ 9

Вы можете использовать пакет R2HTML для вывода сеанса в html, и в пакете TeachingDemos есть некоторые аналогичные функции (см. txtStart) для вывода на расширенный текст и слово (через R2wd). Неграфические команды будут включены в файл автоматически, и текущий график может быть вставлен одной командой.

Ответ 10

Через чудеса щебета, кто-то протянул руку и отправил мне ссылку на эту страницу относительно пакета под названием "roux". Он был создан год назад, и я никогда не слышал об этом (по-видимому, и большинство из вас).

Этот пакет, похоже, делает именно то, что я искал в моем вопросе, хотя установка кажется нетривиальной.

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

Ответ 11

хорошее предложение от @znmeb, чтобы попробовать Lyx - более текстовый интерфейс для LaTeX, и, как указывает документация, есть хорошая статья его использования с Sweave на стр. 2 of этот выпуск новостей R

Вот как я это сделал в Ubuntu 10.04, следуя рекомендациям в репозитории lyx sweave:

sudo apt-get install lyx
cd ~./lyx
wget http://cran.fhcrc.org/contrib/extra/lyx/preferences
cd layouts
wget http://cran.fhcrc.org/contrib/extra/lyx/literate*
wget http://cran.fhcrc.org/contrib/extra/lyx/literate-article.layout
wget http://cran.fhcrc.org/contrib/extra/lyx/literate-book.layout
wget http://cran.fhcrc.org/contrib/extra/lyx/literate-report.layout
wget http://cran.fhcrc.org/contrib/extra/lyx/literate-scrap.inc
cd ~/texmf/tex
wget http://www.biostat.jhsph.edu/~rpeng/ENAR2009/Sweave.sty
  • start Lyx
  • Настройки → Переконфигурировать
  • перезапустить Lyx
  • Файл → новый
  • Документ → Настройки → Класс документа → статья (Sweave noweb)

полезные ссылки: