#r #sweave
#r #sweave
Вопрос:
Я часто создаю определенные файлы sweave для проведения анализа и создания PDF-документов, однако иногда я хочу взять существующий файл R-скрипта и запустить его, одновременно создавая PDF-файл команд и выходных данных вместе. Я знаю, что есть команда tangle, которая извлекает команды R из файла rnw sweave для создания R-скрипта, но я хочу обратного.
Редактировать: Я рассматривал возможность создания файла sweave, который просто является исходным кодом моего R-скрипта, но мне нужно было бы каждый раз редактировать файл sweave, и это не очень хорошо справлялось бы с графиками.
итак, для примера R-скрипта, подобного этому (псевдокод, может не выполняться)
head(mcars)
1 1
x<-3
describe(mcars)
p <- ggplot(mtcars, aes(wt, mpg))
p geom_point()
print(p)
Это сгенерировало бы
<<echo=TRUE, result=latex>>=
print(xtable(head(mcars)))
@
<<echo=TRUE, include=TRUE>>=
1 1
x<-3
@
<<echo=TRUE, result=latex>>=
print(xtable(describe(mcars)))
@
<<echo=TRUE, fig=TRUE, include=TRUE>>=
p <- ggplot(mtcars, aes(wt, mpg))
p geom_point()
print(p)
@
Кто-нибудь это делал?
Комментарии:
1. Я сделал это для HTML в пакете helpr, но не для latex.
2. Интересная идея. Похоже, что для этого потребуется довольно сложное понимание R. Но что-то работоспособное, вероятно, можно было бы сделать с помощью perl-скрипта (управляемого набором настраиваемых правил.)
Ответ №1:
У меня есть пакет с именем knitr
в стадии разработки, который может подойти вам, но я должен предупредить вас, что он все еще находится на ранней стадии разработки, поэтому могут существовать ошибки. Прочитайте раздел о ссылках на код в неполном руководстве https://github.com/downloads/yihui/knitr/knitr-manual.pdf
По сути, вы пишете пустой фрагмент в Sweave, например
<<my-chunk-label>>=
@
и вы используете ту же метку во внешнем R-скрипте (например, foo.R
)
## @knitr my-chunk-label
1 1; x <- 3
Опция chunk ref
используется для указания пути к скрипту (например, ref=foo.R
); knitr
будет считывать R-скрипт и сопоставлять метки с документом Rnw.
Ответ №2:
Нет, но создать его не так уж сложно source(file, echo=TRUE)
. С использованием приведенных ниже функций следующая функция создает файл LaTeX. Попробуйте!
latexR("code.R")
Я попробовал это со следующим code.R
файлом:
c("hi",
"there")
1 1
a <- 5
plot(1:a) # a plot
# hi there
data.frame(a=1:5, b=LETTERS[1:5])
Ниже приведены функции. latex
Метод S3 — это способ заставить его выводить специальное форматирование LaTeX для данного типа объекта, в противном случае он просто выводит вывод дословно. Он также устанавливает графическое устройство по умолчанию для сохранения в pdf и вывода имени файла.
latex <- function(obj) {
UseMethod("latex")
}
latex.data.frame <- function(obj) {
print(xtable(obj), floating=FALSE)
}
latex.default <- function(obj) {
cat("\begin{Soutput}n")
if (isS4(obj))
methods::show(obj)
else print(obj)
cat("\end{Soutput}n")
}
fig <- function(...) {
i <<- i 1
n <- paste(nam, formatC(i, width=3, flag="0"), sep="-")
f <- paste(n, "pdf", sep=".")
cat("\includegraphics{", n, "}n",sep="")
pdf(file=f, ...)
}
stopfig <- function() { if(dev.cur()!=1) dev.off() }
latexR <- function(file, base=sub(".R","", file)) {
eval.with.vis <- function(expr, envir = parent.frame(), enclos = if (is.list(envir) ||
is.pairlist(envir)) parent.frame() else baseenv())
.Internal(eval.with.vis(expr, envir, enclos))
on.exit(sink())
sink(paste(base,"tex",sep="."))
cat("\documentclass{article}n\usepackage{Sweave}n\begin{document}n")
environment(fig) <- list2env(list(i=0, nam=base))
options(device=fig)
exprs <- parse(file)
srcrefs <- attr(exprs,"srcref")
lastshown <- 0
for(i in seq_along(exprs)) {
srcref <- srcrefs[[i]]
dep <- getSrcLines(attr(srcref, "srcfile"), lastshown 1, srcref[3L])
lastshown <- srcref[3L]
cat("\begin{Sinput}n", paste(dep, collapse="n"), "n\end{Sinput}n", sep="")
yy <- eval.with.vis(exprs[i])
stopfig()
if(yy$visible) latex(yy$value)
}
cat("\end{document}")
}