チャンク出力の制御

チャンクの6種類の出力とインライン出力を操作する

オリジナルのページ:

オリジナルの更新日: 2012-01-25


main manual の導入の通り, knitr は R コードチャンクの評価のために evaluate パッケージを使用し, その出力は6種類あります. ソースコード, 通常テキスト出力, メッセージ文, 警告文, エラー文, そしてグラフです. 以降ではこれらをうまく制御する方法を要約します.

  1. ソースコード: チャンクオプション echo を使います, 例: echo=FALSE は R コードを隠します
  2. 通常テキスト出力: results オプションを使います (markup はテキストをマークアップし, asis はテキストをそのまま出力し, hide は結果を隠します)
  3. メッセージ文: message オプションを使います (FALSE は出力されるメッセージ文を隠します)
  4. 警告文: warning オプションを使います (FALSE は出力される警告文を隠します)
  5. エラー文: error オプションを使います (FALSE はエラー発生時点で R の処理を停止し, TRUE は出力にエラー文を表示します)
  6. グラフ: fig.keep オプションを使います. (none は全てのグラフを破棄し, all は全ての低水準プロットに分けて保存し, high は高水準作図として保存します)

これらのオプションは互いに独立しており, 他のタイプの出力への影響を気にすることなく自由に切り替えることができます.

knitr の全てのオプションは R の評価式から値を取ることができます. これは main manual で条件評価 (conditional evaluation) の機能として紹介したものです. 端的に言うなら eval=dothis は実際の値 value はグローバル環境の dothis とい変数から取られた値になるということです. この変数を操作することで, 1つ1つのチャンクの評価をオン・オフ切り替えることができます.

echo オプションの発展的な使い方

チャンクオプション echoTRUE/FALSE だけでなく, 数値のベクトルを取ることで出力文を選択することができます. このベクトルのインデックスはコードチャンクを完全な R 評価式単位でインデックスします. たとえば echo=1 は出力内の最初のソースコード出力のみを含めることを意味します. 以下はこの例の完全版です.

<<hide-par, echo=3:4>>=
## 表示させたくない「醜い」コード
par(mar = c(4, 4, 0.1, 0.1), cex.lab = 0.95, cex.axis = 0.9,
    mgp = c(2, 0.7, 0), tcl = -0.3)
plot(mtcars[, 1:2])
plot(mtcars[, 4:5])
@

評価式 par() はこのコードチャンクに必須ではなく, 読み手の集中力を逸らすことすらあります. そこで出力からこれを隠したいとなるでしょう. このケースでは, 最初の評価式 (コメントのことです) も見せたくありません. echo=3:4 ならば3, 4番めの評価式が出力に含まれることを意味します. 評価式のインデックスが行番号と同じである必要はありません. 代わりに 1,2番めの評価式を削除するという意味で echo=-(1:2) とすることもできます.

ソースコードを部分部分に分けて選択すると, 読み手は混乱するかもしれません. (相対的に) 完全な部分集合を選ぶために, ほとんどの場合は a:b または -(a:b) を使うべきでしょう. しかし, 誰もあなたに禁じることはできません.

% 3, 5 番めの評価式を選択
<<hide-par, echo=c(3, 5)>>=
## 表示させたくない「醜い」コード
par(mar = c(4, 4, 0.1, 0.1), cex.lab = 0.95, cex.axis = 0.9,
    mgp = c(2, 0.7, 0), tcl = -0.3)
plot(mtcars[, 1:2])
par(mar = c(4, 4, 1, 0.5)) # reset margins
plot(mtcars[, 4:5])
@

インライン出力

チャンクの出力とは別の出力タイプがあります. インライン R コードの出力です (例: \Sexpr{t.test(x)$p.value}). 数値の出力は特別な扱われ方をします. 非常に大きいか小さい数値は指数表記で書き出されます. 指数表記になるしきい値は R オプションの scipen (詳細は ?options を参照してください) によります. 基本的に \(10^4\) より大きいか, \(10^{-4}\) より小さい場合に指数表記になります (負の数でも絶対値が同様に評価されます). 出力フォーマット (LaTeX とか HTML とか) に応じて, knitr$3.14 \times 10^5$3.14 &times; 10<sup>5</sup> というように適切なコードで出力します.

もう1つの R オプション digits は, どの桁で丸めるべきかを制御します. デフォルトの options(scipen = 0, digits = 4) が気に入らないならば, こんなふうに最初のチャンクで変更できます.

## 10^5 以上ならば指数表記され, 2 桁で丸める
options(scipen = 1, digits = 2)

R Markdown での例:

インラインコードでは「``` `r'' 1+1` ```」と表示される

インラインコードでは「2」と表示される

上記の例では他の地の文とともに 2 と表示されます.

Rnw の例 (LaTeX):

Inline code looks like this \Sexpr{1+1}

R HTML の例:

<p>Inline code looks like this <!--rinline 1+1 --></p>

R HTML 文書では, デフォルトでは結果の文字列は <code></code> で囲まれます. 出力から <code></code> タグをなくしたいなら, R コードを I() で囲むだけです. 例:

<p>Inline code looks like this <!--rinline I(1+1) --></p>

さらに別の用例をスタックオーバーフローの投稿で見ることができます.

Long lines of text output

通常, R はテキスト出力時に width オプション (options(width = ??) で設定されたもの) を尊重します. たとえば rnorm(100) として見てください. width のデフォルト値は 75 に設定されていますが, あなたが LaTeX を使っているならこれより小さい値を望むかもしれません. いくつかのケースでは, 小さな値を設定していたとしても実際の出力の幅が広すぎることがあるかもしれません. それは大抵の場合, R がこのオプションを尊重してないためです. 私はこの問題にあまりできることはありませんが, knitr 側でハックする方法がいくつかあります. その例の1つは issue #421 で見られます27.

1メッセージに1コメントを

R でメッセージ文を書き出すのに cat() を使うのが好きな人がたくさんいますが, これは大変よくない使い方です. このような形にメッセージ文は非表示にするのが大変だからです. 本当に メッセージ を提示したい場合は, message() 関数を使うべきです. 正規のメッセージは suppressMessages() で表示を抑制したり, knitr で補足したりすることができ便利です. パッケージ開発者の中にはこの問題に注意を払ってない人がいます. そのようなパッケージを読み込んだりパッケージの関数を使ったりすると, 表示を抑制できない偽物のメッセージ文を見かけます. パッケージのスタートアップメッセージはじっさい必要ですが, それは packageStartupMessage() で表示すべきです. knitrmessage=FALSE でメッセージを消せないなら, それはパッケージ開発者に変更を要求するときです.

同様に, 警告を発したいならまさに warning() を使うべきです.

というわけで, あなたの cat の振る舞いに気をつけてください!

その他

チャンクで echo=FALSE, results='hide' を使用した時, 出力に余分な空白行があるかもしれません. 空白行がいらないのなら, issue #231 で解決できるかもしれません.


  1. 訳注: citation() の出力が width に対応していない場合の問題です↩︎