Генерация LaTeX из кадра данных R

Я запускаю R v2.14.1 на Ubuntu. Я пишу script, который сгенерирует кадр данных, который представляет таблицу результатов.

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

Есть ли некоторые рекомендации, которые я могу выполнить, для вывода tex из фреймворка? Кроме того, будет ли это проще (более прямолинейно), если я построил строку TeX непосредственно из моего R script и сохранил строку в файл? (Мне непонятно, что Sweave предлагает заново и вручную строит строку TeX "вручную" ).

Ответы

Ответ 1

В пакете xtable приведены примеры создания таблиц - см. виньетку. Когда вы пишете кусок, убедитесь, что вы установили кусок в <<results=tex>>. См. пример Sweave, например this.

Вот как я буду выводить data.frame.

<<results=tex>>
    xtable(my.data.frame)
@

И исходный результат будет выглядеть примерно так:

> xtable(my.data.frame)
% latex table generated in R 2.14.1 by xtable 1.6-0 package
% Tue Feb 14 10:03:03 2012
\begin{table}[ht]
\begin{center}
\begin{tabular}{rllr}
  \hline
 & p & q & r \\ 
  \hline
1 & condition\_a & grp\_1 &   3 \\ 
  2 & condition\_a & grp\_1 &   3 \\ 
  3 & condition\_a & grp\_1 &   4 \\ 
  4 & condition\_a & grp\_1 &   1 \\ 
  5 & condition\_b & grp\_1 &   4 \\ 
  6 & condition\_b & grp\_1 &   3 \\ 
  7 & condition\_b & grp\_1 &   5 \\ 
  8 & condition\_b & grp\_1 &   5 \\ 
  9 & condition\_a & grp\_2 &   4 \\ 
  10 & condition\_a & grp\_2 &   1 \\ 
  11 & condition\_a & grp\_2 &   1 \\ 
  12 & condition\_a & grp\_2 &   1 \\ 
  13 & condition\_b & grp\_2 &   5 \\ 
  14 & condition\_b & grp\_2 &   1 \\ 
  15 & condition\_b & grp\_2 &   5 \\ 
  16 & condition\_b & grp\_2 &   2 \\ 
   \hline
\end{tabular}
\end{center}
\end{table}

Ответ 2

Я часто использую latex и describe функции из пакета Hmisc, которые позволяют много тонкой настройки.

library(Hmisc)
d <- data.frame(a=LETTERS[1:5], x=rnorm(5))
latex(d, file="")            # If you want all the data
latex(describe(d), file="")  # If you just want a summary

Ответ 3

Лично мне нравится управлять всем моим кодом из R, а не с Rnw файлом, когда я вывожу сводные таблицы и не пишу отчет, используя cat() и sink(), это позволяет работать из текущего вместо того, чтобы заставлять все загружать и перезагружать каждый раз, когда вам нужно повторно запустить документ. Кроме того, он немного упрощает использование R для "дублирования", "вставки" или "петли" с помощью большого количества данных или списков данных. Следует отметить, однако, что это несколько нарушает идею воспроизводимого исследования.

Вот пример того, что я бы поставил в R файл (помня, конечно, что нужно экранировать \:

dat <- list()
for(i in 1:15) {
  dat[[i]] <- sample(c("A","B"),1000,replace=TRUE) # Dummy data
}

sink("temp.Rnw")

cat("
\\documentclass{article}
\\usepackage{Sweave}
\\begin{document}
")

# Print a lot of tables
invisible(
  lapply(dat, 
       function(x) 
         print(xtable(table(x),caption=names(x)),table.placement="!htp"))
  ) 

cat("
\\end{document}
")

sink()
Sweave("temp.Rnw")
compilePdf("temp.Rnw")

Ответ 4

Лучшее решение, которое я нашел, - это пакет Rtable Xtable. Вы можете очень легко сгенерировать файл в формате LaTeX, который

x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
y <- c(10, 20, 30, 40, 50, 60, 70, 80, 90)
df <- data.frame("x"=x, "y"=y)
print.xtable(xtable(head(df)), file = "./Data.txt")

Затем вы можете добавить содержимое "Data.txt" в ваш файл LaTeX с

\input{./Data.txt}

Более быстрое и грязное решение, которое просто перенаправляет вывод текста, который обычно выводится на консоль, заключается в следующем:

sink("./Output.txt")
head(data)
sink()

Вы также можете использовать cat(), чтобы добавить отдельные комментарии