6

少し前にSweaveを使い始めました。しかし、ほとんどの人と同じように、私はすぐに大きな問題に遭遇しました。それは速度です。大きなドキュメントをスイーブすると、実行に時間がかかるため、効率的な作業が非常に困難になります。cacheSweaveを使用すると、データ処理を大幅に高速化できます。ただし、プロット(特にggplot;)-はレンダリングに時間がかかりすぎます。それが私がpgfSweaveを使いたい方法です。

何時間も経った後、私はついにEclipse / StatET/Texlipseで動作するシステムをセットアップすることに成功しました。次に、既存のレポートをpgfSweaveで使用するように変換したかったのですが、残念なことに、ほとんどのggplotが機能しなくなったようです。たとえば、次のプロットは、コンソールとSweaveで完全に機能します。

pl <- ggplot(plot_info,aes(elevation,area))
pl <- pl + geom_point(aes(colour=que_id))
print(pl)

pgfSweaveで実行すると、次のエラーが発生します。

Error in if (width > 0) { : missing value where TRUE/FALSE needed
In addition: Warning message:
In if (width > 0) { :
  the condition has length > 1 and only the first element will be used
Error in driver$runcode(drobj, chunk, chunkopts) : 
  Error in if (width > 0) { : missing value where TRUE/FALSE needed

geom_pointからaes(...)を削除すると、プロットはpgfSweaveで完全に機能します。

pl <- ggplot(plot_info,aes(elevation,area))
pl <- pl + geom_point()
print(pl)

編集:私は問題をさらに調査し、問題をtikz-deviceに減らすことができました。

これは問題なく機能します。

quartz()
pl <- ggplot(plot_info,aes(elevation,area))
pl <- pl + geom_point(aes(colour=que_id))
print(pl)

これにより、上記のエラーが発生します。

tikz( 'myPlot.tex',standAlone = T )
pl <- ggplot(plot_info,aes(elevation,area))
pl <- pl + geom_point(aes(colour=que_id))
print(pl)
dev.off()

これも問題なく機能します。

tikz( 'myPlot.tex',standAlone = T )
pl <- ggplot(plot_info,aes(elevation,area))
pl <- pl + geom_point()
print(pl)
dev.off()

5つの異なるggplotでこれを繰り返すことができます。マッピングで色(またはサイズ、アルファなど)を使用しない場合は、tikzで機能します。

Q1:この振る舞いについて誰か説明がありますか?

さらに、非プロットコードチャンクのキャッシュはあまりうまく機能しません。次のコードチャンクは、Sweaveではまったく時間がかかりません。pgfSweaveでは、約10秒かかります。

<<plot.opts,echo=FALSE,results=hide,cache=TRUE>>=
#colour and plot options are globally set
pal1 <- brewer.pal(8,"Set1")
pal_seq <- brewer.pal(8,"YlOrRd")
pal_seq <- c("steelblue1","tomato2")
opt1 <- opts(panel.grid.major = theme_line(colour = "white"),panel.grid.minor = theme_line(colour = "white"))
sca_fill_cont_opt <- scale_fill_continuous(low="steelblue1", high="tomato2")
ory <- geom_hline(yintercept=0,alpha=0.4,linetype=2) 
orx <- geom_vline(xintercept=0,alpha=0.4,linetype=2)
ts1 <- 2.3
ts2 <- 2.5
ts3 <- 2.8
ps1 <- 6
offset_x <- function(x,y) 0.15*x/pmax(abs(x),abs(y))
offset_y <- function(x,y) 0.05*y/pmax(abs(x),abs(y))
plot_size <- 50*50

一部の変数のみが後で使用するために設定されているため、これもかなり奇妙な動作のようです。

Q2:その説明はありますか?

Q3:より一般的には、pgfSweaveをうまく使用している人がいるかどうかを尋ねたいと思います。成功すると、Sweaveで機能するすべてのものがpgfSweaveでも機能し、優れたフォントと速度の向上という追加の利点があります。;)

ご回答ありがとうございます!

4

3 に答える 3

4

Q1:この振る舞いについて誰か説明がありますか?

プロットを作成しようとしたときにtikzDeviceがエラーを出す理由は次の3つです。

  • のような凡例を作成する美的マッピングを追加するとaes(colour=que_id)、ggplot2は凡例のタイトルとして変数名を使用します---この場合はque_idです。

  • tikzDeviceは、凡例のタイトルなどのすべての文字列をLaTeXに渡して植字します。

  • LaTeXでは、_下付き文字を示すためにアンダースコア文字、が使用されます。数学モード以外でアンダースコアを使用すると、エラーが発生します。

tikzDeviceが凡例タイトル「que_id」の高さと幅を計算しようとすると、タイプセットのために文字列をLaTeXに渡し、LaTeXが文字列の幅と高さを返すことを期待します。mathmodeの外部の文字列で使用されているエスケープされていないアンダースコアがあるため、LaTeXでエラーが発生します。tikzDeviceは、チェックが失敗するNULL原因となる数値ではなく、文字列幅のaを受け取ります。if (width > 0)

問題を回避する方法

  1. カラースケールを追加して、使用する凡例のタイトルを指定します。

    p1 <- ggplot(plot_info, aes(elevation, area))
    p1 <- p1 + geom_point(aes(colour=que_id))
    
    
    # Add a name that is easier for humans to read than the variable name
    p1 <- p1 + scale_colour_brewer(name="Que ID")
    
    
    # Or, replace the underscore with the appropriate LaTeX escape sequence
    p1 <- p1 + scale_colour_brewer(name="que\\textunderscore id")
    
  2. tikzDevice 0.5.0で導入された文字列サニタイズ機能を使用します(ただし、0.5.2まで機能していませんでした)。現在、文字列のサニタイズは次の文字のみをエスケープします:%、、、、、およびデフォルト。ただし、オプションを使用して追加の置換ペアを指定できます。${}^tikzSanitizeCharacterstikzReplacementCharacters

    # Add underscores to the sanitization list
    options(tikzSanitizeCharacters = c('%','$','}','{','^', '_'))
    options(tikzReplacementCharacters = c('\\%','\\$','\\}','\\{',
      '\\^{}', '\\textunderscore'))
    
    
    # Turn on string sanitization when starting the plotting device
    tikz('myPlot.tex', standAlone = TRUE, sanitize = TRUE)
    print(p1)
    dev.off()
    

Rの処理方法の変更により表示される迷惑な警告メッセージに対処するために、今後数週間でtikzDeviceのバージョン0.5.3を公開する予定system()です。この次のバージョンに次の変更を追加します。

  • プロットテキストに何か問題がある可能性があることを示しているwidth場合の警告メッセージが改善されました。NULL

  • 文字列サニタイザーが検索するデフォルトの文字セットに、アンダースコアとその他のいくつかの文字を追加します。

お役に立てれば!

于 2010-11-19T01:17:06.577 に答える
3

Q2:私はpgfsweaveのメンテナーです。

これが私が実行したテストの結果です:

time R CMD Sweave time-test.Rnw 

real    0m1.133s
user    0m1.068s
sys     0m0.054s

time R CMD pgfsweave time-test.Rnw 

real    0m2.941s
user    0m2.413s
sys     0m0.364s

time R CMD pgfsweave time-test.Rnw 

real    0m2.457s
user    0m2.112s
sys     0m0.283s

時差には2つの理由があると思いますが、正確に検証するにはさらに作業が必要です。

  • pgfSweaveは、大量のチェックとダブルチェックを実行して、コストのかかる計算をやり直していないことを確認します。目標は、ドキュメント内でより高価な計算とプロットを実行できるようにすることです。この場合の「高価」の規模は、チェックを行うための追加の1〜2秒よりもはるかに大きくなります。

キャッシングの例として、次のテストファイルを検討して、キャッシングの実際の利点を確認してください。

\documentclass{article}

\begin{document}

<<plot.opts,cache=TRUE>>=
x <- Sys.sleep(10)
@

\end{document}

そして結果:

time R CMD Sweave time-test2.Rnw 

real    0m10.334s
user    0m0.283s
sys     0m0.047s

time R CMD pgfsweave time-test2.Rnw 

real    0m12.032s
user    0m1.356s
sys     0m0.349s

time R CMD pgfsweave time-test2.Rnw 

real    0m1.423s
user    0m1.121s
sys     0m0.266s
  • SweaveはR2.12でいくつかの変更が加えられました。この変更により、コードチャンクの評価プロセスが高速化され、これらの小規模な計算のためにpgfSweaveが残された可能性があります。調べる価値がある

Q3:私は自分の仕事のためにいつもpgfSweaveを使用しています。R 2.12のSweaveにいくつかの変更があり、pgfSweaveでいくつかの小さな問題が発生していましたが、すべてを修正する新しいバージョンが間もなく登場します。githubの開発バージョン(https://github.com/cameronbracken/pgfSweave)にはすでに変更が加えられています。さらに問題が発生した場合は、喜んでサポートさせていただきます。

于 2010-11-18T23:47:31.880 に答える
1

Q2:グラフィックチャンク\pgfrealjobname{<DOCUMENTNAME>}のヘッダーとオプションで使用しますか?external=TRUEこれにより、速度が大幅に向上することがわかりました(最初のコンパイルではなく、グラフィックが変更されていない場合は後続のコンパイルで)。pgfSweaveビネットでより多くの背景を見つけることができます。

Q3:すべてが正常に機能します。私は、あなたと同じようにWindows + Eclipse / StatEt/Texlipseを使用しています。

于 2010-11-18T12:45:43.077 に答える