Как заставить Sweave поместить графику в отдельную папку И назвать ее после файла Rnw - PullRequest
5 голосов
/ 31 августа 2011

Я видел несколько вопросов по этому поводу, но не могу понять, как делать то, что я хочу.

По умолчанию Sweave создает графику, объединяя имя файла Rnw и имяметка графического объекта.

Из этого вопроса ( Make Sweave + RweaveHTML помещает всю графику в указанную папку ) Если я хочу, чтобы вся моя графика находилась в папке foo и называлась bar-graphicЯ могу использовать

\SweaveOpts{prefix.string=foo/bar}

Но как мне получить графику в папке foo, но с именем rnwfile-graphic?

Ответы [ 2 ]

5 голосов
/ 31 августа 2011

ОК, это, вероятно, следует назначить внутреннему кругу ада, но единственный способ узнать имя исполняемого в данный момент сценария - использовать (злоупотреблять?) Ссылку на источник, прикрепленную к функциям.Рассмотрим этот фрагмент Sweave в файле foo.Rnw

<<>>=
foo <- function(x) {x}
srcref <- attr(body(foo), "srcref")[[1]]
attr(srcref, "srcfile")$filename
@

Когда я обрабатываю foo.Rnw с помощью Sweave, я получаю:

\begin{Schunk}
\begin{Sinput}
> foo <- function(x) {
+     x
+ }
> srcref <- attr(body(foo), "srcref")[[1]]
> attr(srcref, "srcfile")$filename
\end{Sinput}
\begin{Soutput}
[1] "foo.Rnw"
attr(,"encoding")
[1] "ASCII"
\end{Soutput}
\end{Schunk}

Вы можете сделать фиктивную функцию в верхней части вашегоИзвлеките файл, извлеките $filename из ссылки на источник и обработайте его, чтобы удалить расширение, например:

> sub("\\.Rnw", "", "foo.Rnw")
[1] "foo"

, а затем соберите строку, необходимую для prefix.string, например,

<<>>=
fname <- sub("\\.Rnw", "", attr(srcref, "srcfile")$filename)
prefix.string <- paste("foo/", fname, "-graphic", sep = "")
@

\SweaveOpts{prefix.string=\Sexpr{prefix.string}}

, где prefix.string содержит созданный путь и префикс.

Вот полный пример:

<<>>=
foo <- function(x) {x}
srcref <- attr(body(foo), "srcref")[[1]]
attr(srcref, "srcfile")$filename
@

<<>>=
fname <- sub("\\.Rnw", "", attr(srcref, "srcfile")$filename)
prefix.string <- paste("foo/", fname, "-graphic", sep = "")
@

\SweaveOpts{prefix.string=\Sexpr{prefix.string}}

<<fig=TRUE>>=
plot(1:10)
@

, который при обработке Sweave дает:

\begin{Schunk}
\begin{Sinput}
> foo <- function(x) {
+     x
+ }
> srcref <- attr(body(foo), "srcref")[[1]]
> attr(srcref, "srcfile")$filename
\end{Sinput}
\begin{Soutput}
[1] "foo.Rnw"
attr(,"encoding")
[1] "ASCII"
\end{Soutput}
\end{Schunk}

\begin{Schunk}
\begin{Sinput}
> fname <- sub("\\.Rnw", "", attr(srcref, "srcfile")$filename)
> prefix.string <- paste("foo/", fname, "-graphic", sep = "")
\end{Sinput}
\end{Schunk}



\begin{Schunk}
\begin{Sinput}
> plot(1:10)
\end{Sinput}
\end{Schunk}
\includegraphics{foo/foo-graphic-003}

Отрегулируйте, как считаете нужным.

3 голосов
/ 01 сентября 2011

Хотя взлом Гэвина великолепен, если вы действительно хотите, чтобы Sweave делал разные вещи, лучший способ сделать это - написать свой собственный драйвер; Я использую этот метод, например, чтобы заставить Sweave по-разному масштабировать разные фигуры. Вам не нужно начинать с нуля, но вы можете просто изменить существующий код по мере необходимости.

В этом случае необходимо изменить только пару второстепенных функций, однако, из-за проблем с пространством имен проще начать со всего кода Sweave; Вы можете получить 2,13 Sweave-код здесь .

Необходимые изменения приведены ниже. Они добавляют новый параметр subdir и добавляют его к исходному chunkprefix, который является именем файла rnw. Строка SweaveParseOptions необходима, поскольку эта функция не экспортируется utils и находится в другом исходном файле.

16a17,18
> SweaveParseOptions <- utils:::SweaveParseOptions
> 
69c71
<                     concordance = FALSE, expand = TRUE, figs.only = FALSE)
---
>                     concordance = FALSE, expand = TRUE, figs.only = FALSE, subdir=".")
520c522
<                    "grdevice")
---
>                    "grdevice", "subdir")
568c570
<     chunkprefix
---
>     file.path(options$subdir, chunkprefix)

С изменениями, сохраненными как SweaveDriversNew.R, добавьте эту опцию в файл Rnw следующим образом

\SweaveOpts{subdir=foo}

А затем Sweave, используя новый драйвер, как этот.

source("SweaveDriversNew.R")
Sweave("test.Rnw", driver=RweaveLatex)

В результате изображения называются foo/test-graphic.pdf, где в файле Sweave определено foo, а test автоматически взято из имени файла Sweave.

...