On Sun, Oct 01, 2017 at 03:32:10PM +0000, Jürgen Spitzmüller wrote:
> Am Sonntag, den 01.10.2017, 12:57 +0200 schrieb Kornel Benko:
> > Am Sonntag, 1. Oktober 2017 um 11:05:22, schrieb Jürgen Spitzmüller <
> > sp...@lyx.org>
> > > Am Sonntag, den 01.10.2017, 10:14 +0200 schrieb Kornel Benko:
> > > > This is the relevant tex part:
> > > >         \author{Yihui Xie\thanks{アイオワ州立大学統計学部、電子メール:
> > > > \protect\href{mailto:[snip mail address]}}
> > > > \and Gregor Gorjanc \and Jean-Marc Lasgouttes}
> > > 
> > > Which version of the document is this? Here,
> > > lib/examples/ja.lilypond.lyx does not have a \thanks.
> > 
> > Referring sweave.lyx.
> 
> I see. Cannot reproduce this error, though.

Neither can I. Kornel, can you post your .tex file? Mine is attached. I
wonder if there is a difference.

Note that sweave is built-in to R (unlike knitr, which is a separate
package), so only the R version should be important. I tested with R
version 3.4.1 and (after updating) 3.4.2. I am using a PPA though so I
probably have a newer version of R than you. Do you have 3.2.3-4?

$ apt-cache policy r-base
r-base:
  Installed: 3.4.1-2xenial0
  Candidate: 3.4.2-1xenial1
  Version table:
     3.4.2-1xenial1 500
        500 http://ppa.launchpad.net/marutter/rrutter/ubuntu xenial/main amd64 
Packages
        500 http://ppa.launchpad.net/marutter/rrutter/ubuntu xenial/main i386 
Packages
 *** 3.4.1-2xenial0 100
        100 /var/lib/dpkg/status
     3.2.3-4 500
        500 http://us.archive.ubuntu.com/ubuntu xenial/universe amd64 Packages
        500 http://us.archive.ubuntu.com/ubuntu xenial/universe i386 Packages

Scott
\batchmode
\makeatletter
\def\input@path{{/home/scott/lyxbuilds/2.3.x/repo/lib/examples/ja/}}
\makeatother
\documentclass[noae,nogin]{jarticle}
\usepackage{mathpazo}
\renewcommand{\sfdefault}{lmss}
\renewcommand{\ttdefault}{lmtt}
\usepackage[T1]{fontenc}
\usepackage{geometry}
\geometry{verbose,tmargin=3cm,bmargin=3cm,lmargin=3cm,rmargin=3cm}
\usepackage{url}
\usepackage[unicode=true]
 {hyperref}
\usepackage{breakurl}

\makeatletter

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LyX specific LaTeX commands.
\providecommand{\LyX}{\texorpdfstring%
  {L\kern-.1667em\lower.25em\hbox{Y}\kern-.125emX\@}
  {LyX}}
\DeclareRobustCommand*{\lyxarrow}{%
\@ifstar
{\leavevmode\,$\triangleleft$\,\allowbreak}
{\leavevmode\,$\triangleright$\,\allowbreak}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Textclass specific LaTeX commands.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% User specified LaTeX commands.
%% maxwidth is the original width if it's less than linewidth
%% otherwise use linewidth (to make sure the graphics do not exceed the margin)
\def\maxwidth{%
\ifdim\Gin@nat@width>\linewidth
\linewidth
\else
\Gin@nat@width
\fi
}

\makeatother

\usepackage{Sweave}
\begin{document}
%\SweaveOpts{prefix=TRUE,prefix.string=sweave-prefix,keep.source=FALSE}

%% \maxwidth はプリアンブル中で定義されています。文書設定をご覧ください。
\setkeys{Gin}{width=\maxwidth}

\title{\LyX でSweaveを使うには}

\author{Yihui Xie\thanks{アイオワ州立大学統計学部、電子メール: \protect\href{mailto:x...@yihui.name}{x...@yihui.name}}
\and Gregor Gorjanc \and Jean-Marc Lasgouttes}

\maketitle
Sweaveは、文芸的プログラミングの考えに従った、動的なレポート生成するための、R言語(\url{http://www.r-project.org})ツールです。Rコードは、\LaTeX 文書の中で混用することができ、文書がコンパイルされるときにRで実行されます。結果は、\TeX 出力内に書きこまれます。

\LyX{} 2.0以降では、\textsf{Sweave}モジュールを使えば、どの文書クラスでもSweaveをそのまま使うことができます。\textsf{Sweave}モジュールを文書に加えるには、\textsf{文書\lyxarrow 設定\lyxarrow モジュール}を使用します。この説明書では、Sweaveでよく使われる機能をいくつか紹介し、本モジュールがどう動作するかを説明します。この説明書のPDF版は、\url{https://github.com/downloads/yihui/lyx/sweave.pdf}にあります。

\section{システム要件}

\textsf{Sweave}モジュールは、実行ファイル\texttt{Rscript}に依存しますので、このファイルが、システムの\textsf{PATH}変数に含まれるパスになくてはなりません。これは、LinuxやMac
OSユーザーには大した問題とならないでしょうが、Windowsユーザーには混乱を招くかもしれません。Windowsにおける\textsf{PATH}が何かわからない場合には、R言語のリポジトリ\url{https://github.com/yihui/lyx}にあるRスクリプト\textsf{add-R-path-win.R}を使って、パスを自動的に変更するか(推奨はできません。何にせよ\textsf{PATH}が何かくらいは勉強すべきです)、あるいは\textsf{ツール\lyxarrow 設定\lyxarrow パス\lyxarrow パス接頭辞}からRのバイナリパスを追加することができます(推奨)。後者の場合、大抵\textsf{C:\textbackslash Program
Files\textbackslash R\textbackslash R-x.x.x\textbackslash bin}のような形をしており、R内で下記のようにして確認することができます。

\begin{Schunk}
\begin{Sinput}
> R.home('bin')
\end{Sinput}
\end{Schunk}

これらの変更を加えた後、\textsf{ツール\lyxarrow 再初期設定}を使って、\LyX の再設定を行う必要があります。\texttt{Rscript}が\textsf{PATH}にない場合、\textsf{Sweave}モジュールを使うことはできません。Sweaveの更新は続いていますので、最新版のRを使用することをお勧めします。Rに同梱され、このパス下にある(CTANにはありません)\LaTeX スタイルファイル\textsf{Sweave.sty}によって、下記のように依存関係が追加されます。

\begin{Schunk}
\begin{Sinput}
> file.path(R.home('share'), 'texmf', 'tex', 'latex')
\end{Sinput}
\end{Schunk}

Mik\TeX ユーザーは、Mik\TeX の設定で、Mik\TeX のルートディレクトリ一覧にtexmfディレクトリも追加したほうが良いかもしれません。また、\textsf{Sweave.sty}は\textbf{fancyvrb}パッケージに依存しており、\textbf{ae}に依存する\emph{ことも}あります。\LyX が\textsf{Sweave.sty}を検出できないときは、直接Rからコピーしますので、このスタイルファイルがどこにあるかわからない場合でも、Sweaveモジュールは動作します。

\section{Sweaveの用例}

Sweave文書を書く前に、Sweaveオプションを設定しましょう。Sweaveの設定コマンドは\texttt{\textbackslash SweaveOpts\{\}}ですが、これは、\LyX 文書中で、\textsf{挿入\lyxarrow 任意設定差込枠\lyxarrow Sweaveオプション}か、\TeX コードで書く(\textsf{挿入\lyxarrow\TeX コード})ことで挿入することができます。例えば、文頭で大域オプション\texttt{echo=FALSE}を設定して、すべてのRコードを抑制することもできます(既定では、Rコードとその出力は、両方とも\LaTeX 文書中に表示されます)。

\LyX でRコードを書くには、まずレイアウト様式一覧(ツールバーの左上端のドロップリスト)から、\textsf{コード組}環境に変更するか、あるいは、単に\TeX コード環境を開いて、Sweaveのコード組を書き込んでください。後者の方法の方が安定していますので、そちらをお勧めします。

例えば\texttt{width}や\texttt{useFancyQuotes}のようなRオプションもSweaveの出力に便利です。前者のオプションは、出力の幅を調整するものであり、後者は引用符に関してよく起こる問題を回避することができます。詳細については、Rに添付のSweave取扱説明書をお読みください。

\begin{Schunk}
\begin{Sinput}
> ## オプション「digits」は桁数(の概数)を設定できます
> options(width = 70, useFancyQuotes = FALSE, digits = 4)
\end{Sinput}
\end{Schunk}
\begin{Schunk}
\begin{Sinput}
> ## Sweaveのvignetteを見る (要 R >= 2.13.0)
> vignette("Sweave", package = "utils")
\end{Sinput}
\end{Schunk}

下記は、どのSエンジンでも動作する単純な例です。

\begin{Schunk}
\begin{Sinput}
> ## 1から10までの整数は
> 1:10 
\end{Sinput}
\begin{Soutput}
 [1]  1  2  3  4  5  6  7  8  9 10
\end{Soutput}
\end{Schunk}
\begin{Schunk}
\begin{Sinput}
> ## results=hide を設定して意図的に出力を隠す
> print(1:20)
\end{Sinput}
\end{Schunk}

単純な計算機をエミュレートすることもできます。

\begin{Schunk}
\begin{Sinput}
> 1 + pi
\end{Sinput}
\begin{Soutput}
[1] 4.142
\end{Soutput}
\begin{Sinput}
> sin(pi/6)
\end{Sinput}
\begin{Soutput}
[1] 0.5
\end{Soutput}
\end{Schunk}

今度は、ガウシアンデータを見てみましょう。

\begin{Schunk}
\begin{Sinput}
> set.seed(123)  # 再現可能性のため
> x <- rnorm(20)
> print(x)
\end{Sinput}
\begin{Soutput}
 [1] -0.56048 -0.23018  1.55871  0.07051  0.12929  1.71506  0.46092
 [8] -1.26506 -0.68685 -0.44566  1.22408  0.35981  0.40077  0.11068
[15] -0.55584  1.78691  0.49785 -1.96662  0.70136 -0.47279
\end{Soutput}
\begin{Sinput}
> t1 <- t.test(x)
\end{Sinput}
\end{Schunk}

数値を標準テキストに簡単に統合させることができます。これは、\texttt{\textbackslash Sexpr\{\}}コマンドによって行われ、\LyX 中の対応するメニューは\textsf{挿入\lyxarrow 任意設定差込枠\lyxarrow S/R表現}ですが、\TeX コードを使うこともできます。例えば、ベクトル\texttt{x}の第3要素は、1.55870831414912
(すなわち\texttt{x{[}3{]}})であり、検定の$p$値は0.52です。これらの数値は、R中で\emph{round()}のようなコマンドを使うことによって丸めることもできます。

今度は、\texttt{iris}データセットの要約を見てみましょう。

\begin{Schunk}
\begin{Sinput}
> summary(iris[,-5])
\end{Sinput}
\begin{Soutput}
  Sepal.Length   Sepal.Width    Petal.Length   Petal.Width 
 Min.   :4.30   Min.   :2.00   Min.   :1.00   Min.   :0.1  
 1st Qu.:5.10   1st Qu.:2.80   1st Qu.:1.60   1st Qu.:0.3  
 Median :5.80   Median :3.00   Median :4.35   Median :1.3  
 Mean   :5.84   Mean   :3.06   Mean   :3.76   Mean   :1.2  
 3rd Qu.:6.40   3rd Qu.:3.30   3rd Qu.:5.10   3rd Qu.:1.8  
 Max.   :7.90   Max.   :4.40   Max.   :6.90   Max.   :2.5  
\end{Soutput}
\end{Schunk}

\begin{table}
\caption{\texttt{iris}データの最初の4変数の分位数\label{tab:xtable-demo}}

\centering{}
% latex table generated in R 3.4.2 by xtable 1.8-2 package
% Sun Oct  1 12:59:10 2017
\begin{tabular}{rrrrr}
  \hline
 & Sepal.Length & Sepal.Width & Petal.Length & Petal.Width \\ 
  \hline
0\% & 4.30 & 2.00 & 1.00 & 0.10 \\ 
  25\% & 5.10 & 2.80 & 1.60 & 0.30 \\ 
  50\% & 5.80 & 3.00 & 4.35 & 1.30 \\ 
  75\% & 6.40 & 3.30 & 5.10 & 1.80 \\ 
  100\% & 7.90 & 4.40 & 6.90 & 2.50 \\ 
   \hline
\end{tabular}\end{table}

通常、人々はこのような「生の」出力を好みませんので、これらのごちゃごちゃした数字を、\textbf{xtable}パッケージを使って綺麗にしてやるといいでしょう。表\ref{tab:xtable-demo}は、Sweaveでの\textbf{xtable}パッケージの使い方を示すための例です。コード組のオプション\texttt{results=tex}は、R出力が、特別な環境(\texttt{Soutput})で包まれるのではなく、生の\LaTeX コードとして書き出されるように保証するためのものです。

図\ref{fig:iris-pairs}と図\ref{fig:iris-boxplots}は、Sweaveを使って画像を生成する簡単な例です。

\begin{figure}
\begin{centering}
\begin{Schunk}
\begin{Sinput}
> pairs(iris, col = iris$Species)
\end{Sinput}
\end{Schunk}
\includegraphics{sweave-iris-pairs}
\par\end{centering}
\caption{\texttt{iris}データの散布図マトリックス\label{fig:iris-pairs}}
\end{figure}

\begin{figure}
\begin{centering}
\begin{Schunk}
\begin{Sinput}
> par(mar = c(4, 5, 0.1, 0.3), las = 1)
> boxplot(Sepal.Length ~ Species, data = iris, horizontal = TRUE, 
+     xlab = "Sepal.Length")
\end{Sinput}
\end{Schunk}
\includegraphics{sweave-iris-boxplots}
\par\end{centering}
\caption{種でグループ化された萼片の長さのボックスプロット\label{fig:iris-boxplots}}
\end{figure}

Sweave文書中のRコードは、単一のRスクリプトとして書きだすことができますが、これは\texttt{R CMD Stangle}を使って行われます。

\section{\textsf{Sweave}モジュール}

\textsf{Sweave}モジュールは、\LyX 文書が、Rを使った文芸的プログラミングのコンポーネントを含んでいることを宣言しますので、\LyX は、そのような文書を取り扱う特定の変換子を使って処理します(取扱説明書カスタマイズ篇参照)。\textsf{Sweave}モジュールは、\textsf{sweave}変換子を使用しますが、これは、\LyX の\textsf{scripts}ディレクトリ下にあるRスクリプト\textsf{lyxsweave.R}が本体になっています。このスクリプトは、\LyX から\textsf{Rnw}文書を受け取り、これを\TeX 文書に変換するためにSweaveを呼び出します。その後の作業は、\LyX が面倒を見ます。

\textsf{sweave}形式から\LaTeX への変換子は、下記のコマンド行でRを呼び出します。

\begin{verbatim}
Rscript --no-save --no-restore $$s/scripts/lyxsweave.R $$p$$i $$p$$o $$e $$r
\end{verbatim}

\LyX ライブラリディレクトリ\texttt{\$\$s}は、\textsf{ヘルプ\lyxarrow\LyX について}メニューに記載があります。他にRに渡すことのできるオプションは、Rスクリプト中で説明されており、また、\LyX 取扱説明書カスタマイズ篇には、\texttt{\$\$i}・\texttt{\$\$o}・\texttt{\$\$e}・\texttt{\$\$r}についての詳しい説明があります。一般ユーザーは、これらの意味について詳しく知る必要はありませんが、ここでは、Rコードにまつわる若干の問題について説明しておく必要があります。
\begin{enumerate}
\item \LyX 文書のエンコーディングを表す文字列は、Rにコマンドラインオプションとして渡されます。取り得る値は、\texttt{ISO-8859-15}や\texttt{UTF-8}などです。エンコーディングは、Rが\textsf{Rnw}文書を正しく読むのに使用されます。
\item Sweave文書内のRコード組は、\LyX 文書のあるディレクトリで実行されます(自信のない場合は、現在の作業ディレクトリがどこかを見るために、コード組に\texttt{getwd()}を置いてください)。この場合、データファイルは同じディレクトリ下に置くことができ、再現可能性を保証するために、R内部では相対パスを使用してください。すなわち、他のシステムでは存在しないかもしれない、ハードコードのパスを書く必要はありません。
\item \LaTeX が\textsf{Sweave.sty}を検出できないと、このRスクリプトが自動的に\textsf{Sweave.sty}を一時ディレクトリにコピーし、そこで\LaTeX コンパイルを実行します。
\item Sweaveは、既定でRnwファイルのファイル名を、画像出力の接頭辞文字列として使用します。既知の問題の1つ(\href{http://www.lyx.org/trac/ticket/7551}{\#7551})として、ファイル名(拡張子を除く)にピリオドが含まれている場合、\LaTeX がそのファイルを\texttt{\textbackslash includegraphics\{\}}で処理する際に失敗しうるということが知られています。したがって、接頭辞の既定値は、すべてのピリオドを「-」で置換したファイル名にしてあります。この問題は、Sweaveで直接的に解決することもができます。Sweaveオプションの\texttt{prefix.string}を、ピリオドを含まない文字列に設定すると、このオプションが既定値を上書きします。
\end{enumerate}
Sweaveパッケージには、事前に\texttt{noae}オプションが設定されています。このオプションは、Sweaveが下記の2つのパッケージを読み込んでしまうのを防ぎます。

\begin{verbatim}
\RequirePackage[T1]{fontenc}  
\RequirePackage{ae}
\end{verbatim}

\LyX は、既定でフォントエンコーディングを取り扱うことができるので、Sweaveにこれをやってもらう必要はないのです(その上、これはパッケージオプションの衝突をもたらす可能性があります)。一方、ユーザーは、必要ならばプリアンブルで\textbf{ae}パッケージを手動で読み込ませることができます。

\section{問題の解決法}

\LyX{} 2.0以降、コンパイル中の詳細な情報を、\textsf{表示\lyxarrow メッセージを表示}で見ることができるようになりました。これは、問題の解決に非常に役に立ちます。Rの処理は、メッセージパネルに表示され、エラーが発生した場合には、どのコード組がおかしいのか知ることができます。例えば、この文書をコンパイルする時、以下のようなメッセージを見ることができるでしょう。

\begin{verbatim}
17:58:47.868: Processing code chunks with options ...
17:58:47.885:  1 : echo keep.source term verbatim (label=setup)
17:58:47.889:  2 : echo keep.source (label=sweave-manual)
17:58:47.908:  3 : echo keep.source term verbatim (label=print-integers)
....
17:58:47.941: Loading required package: xtable
17:58:47.976:  9 : echo term verbatim pdf (label=iris-pairs)
....
17:58:48.116: You can now run (pdf)latex on 'sweave.tex'
\end{verbatim}

\texttt{label=}の後の文字列が、コード組のラベルを示します。コード組のどれかがRでエラーを起こせば、即座にここにエラーメッセージを見ることができます。

もうひとつ知られている問題点は、\LyX 中でコード組段落の配置に(\textsf{段落設定}を使用して)手を加えた場合、\LyX は、改行しないでコード組の前に\texttt{\textbackslash centering\{\}}のようなマクロを書き加えてしまうことがあるので、Sweaveコード組がエラーを起こす場合があるという事です。この場合のコード組は、下記のようになってしまいます。

\begin{verbatim}
\centering{}<<xtable-demo,results=tex,echo=FALSE>>=
\end{verbatim}

\texttt{\textless\textless\textgreater\textgreater =}は行頭すぐに置かれなくてはならないため、これは正しいSweaveコードではありません。したがって、コード組段落の配置に手を加える場合には、\textsf{表示\lyxarrow ソースを表示}で、実際のソースコードを再確認し、\texttt{\textless\textless\textgreater\textgreater =}が改行後に現れるようにすることをお勧めします。表\ref{tab:xtable-demo}のコード組に手動で空行が追加されているのは、このためです。

\section{リソース}

Sweaveのホームページは、\url{http://www.stat.uni-muenchen.de/~leisch/Sweave/}にあります。
The CRAN task view on 「Reproducible Research」にあるCRANタスクビューには、便利と思われるSweave関連パッケージの一覧があります。\url{http://cran.r-project.org/web/views/ReproducibleResearch.html}をご覧ください。\LyX とSweaveに関する質問は、\LyX メーリングリスト(\url{http://www.lyx.org/MailingLists})に投稿してください。さらに多くの\LyX の用例は、\url{https://github.com/yihui/lyx}にあります。

\section{FAQ}

\subsection{Sweaveをbeamerで使うにはどうすればよいでしょうか}

beamerのスライドでSweaveを使うと、\LyX では\LaTeX エラーが発生します。その原因は、生のRコードを含むbeamerフレームのせいです。これを解決するには、通常のフレームの代わりに脆弱フレームを使うか、フレーム表題に\textsf{挿入\lyxarrow フレームオプション}を使って、\texttt{fragile}オプションを渡します。

\subsection{Rnw文書をコンパイルするためのRスクリプトを書いてもいいですか}

もちろんです。まず、前述のRスクリプト\texttt{\$\$s}\textsf{/scripts/lyxsweave.R}がどのように動作するかを理解する必要がありますので、できればそのRソースコードを読むことをお勧めします(特に、Rがパスをどのように取得し、Rnw文書を取り扱うのに\emph{Sweave()}をどのように使っているかを見てください)。その後、カスタマイズした\textsf{lyxsweave.R}をあなたの\emph{ユーザーディレクトリ}(ヘルプ\lyxarrow\LyX についてでチェックできます)の\textsf{scripts}ディレクトリ下に置いてください。\LyX は自身の\emph{ライブラリディレクトリ}を見に行く前に\emph{ユーザーディレクトリ}をチェックしますので、Rスクリプト\textsf{lyxsweave.R}がユーザーディレクトリで検出されれば、それが使用されます。\LyX ライブラリディレクトリ下にあるスクリプトを直接ハックしてしまうと、\LyX 更新時に修正したスクリプトが上書きされてしまいます(ユーザーディレクトリは影響を受けません)ので、お勧めしません。

なお、Rの公式Sweaveの他に、Sweaveの代替ツールである\textbf{knitr}パッケージもサポートされており、対応するモジュール名は\textsf{Rnw
(knitr)}となっています。
\end{document}

Attachment: signature.asc
Description: PGP signature

Reply via email to