5

これについていくつかの質問を見てきましたが、やりたいことを行う方法がわかりません。

デフォルトでは、Sweave は Rnw ファイルの名前とグラフィック オブジェクト ラベルの名前を連結してグラフィックを作成します。

この質問から ( Make Sweave + RweaveHTML put all graphics in a specified folder ) すべてのグラフィックをフォルダー foo に置き、bar-graphic という名前を付けたい場合は、使用できます

\SweaveOpts{prefix.string=foo/bar}

しかし、フォルダー foo にあるが rnwfile-graphic という名前のグラフィックを取得するにはどうすればよいですか?

4

2 に答える 2

5

OK、これはおそらく地獄の最も内側の円に割り当てられるべきですが、現在実行中のスクリプトの名前を取得するために私が知っている唯一の方法は、関数に添付されたソース参照を使用 (悪用?) することです。ファイル内のこの Sweave チャンクを検討してくださいfoo.Rnw

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

foo.RnwSweave で処理すると、次のようになります。

\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}

Sweave ファイルの先頭にダミー関数を作成し$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}}

whereprefix.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}

必要に応じて微調整してください。

于 2011-08-31T16:09:19.477 に答える
3

Gavin のハックはすばらしいものですが、本当に Sweave に別の種類のことをさせたい場合は、独自のドライバーを作成するのが最善の方法です。たとえば、私はこの方法を使用して、Sweave でさまざまな図形を異なる方法でスケーリングします。ゼロから始める必要はなく、必要に応じて既存のコードを変更できます。

この場合に変更する必要がある小さな関数は 2 つだけですが、名前空間の問題があるため、すべての 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。ここでfoo、 は Sweave ファイルで定義され、Sweave ファイルtestの名前から自動的に取得されます。

于 2011-09-01T14:33:42.700 に答える