30

round() Sweave / knitrを使用するときに機能を回避する方法はありますか?round(,2)すべてに書き込むのは本当に面倒\Sexpr{}です。ドキュメント全体で小数点以下2桁にしたいのですが。

助けてくれてありがとう
Mac

4

3 に答える 3

40

パッケージのモチベーションを読んだ方なら、私が一番嫌いな人だということをご存知でしょう。ずっと前にSweaveのRコアにこれを提案しましたが、無視されたので、自分のパッケージを始めました。knitrround()\Sexpr{}

Josh O'Brienによる答えは絶対に正しいですが、本当に必要なのはでのみでありoptions(digits = 2)knitrデフォルトのフックはこのオプションを尊重するため、デフォルトのインラインフックをリセットする必要はありません。

于 2012-06-17T15:47:38.913 に答える
15

ではknitrインラインフックを使用して\Sexpr{}ステートメントの出力を処理できます。したがって、インラインコードの小数点以下2桁だけを印刷する場合(全体のdigitsオプションはそのままにしておきます)、次のように実行できます。

## First have a look at the default inline hook function
knit_hooks$get("inline")

## Then customize it to your own liking
inline_hook <- function(x) {
    if(is.numeric(x)) x <- round(x, 2)
    paste(as.character(x), collapse=", ")
}
knit_hooks$set(inline = inline_hook)
于 2012-06-16T16:17:08.127 に答える
6

まず、ゼロの場合でも2桁を取得するformatC代わりに使用することをお勧めします。roundSweaveでこれを行うための優れた方法はありません。おそらく最良のオプションは、必要なフォーマットを行う短い名前で新しい関数を作成することです。何かのようなもの

p <- function(x) {formatC(x, format="f", digits=2)}

これにより、少なくとも入力の手間が少し節約されます。

The answer is $\Sexpr{p(x)}$.

残念ながら、新しいSweaveドライバーをいじくり回さずに、他に何もすることはないと思います(おそらく、これが試してみるもう1つの理由であり、急速に普及してknitrいるようです)。Sweaveは、ステートメント内の内容に対してこれを実行し、呼び出しを結果 Sexprに置き換えます。Sexpr

as.character(eval(parse(text = cmd), envir = .GlobalEnv))

as.characterただし、 ;の新しいバージョンを作成するだけでは不十分です。名前の間隔が原因で、他の予期しない方法で動作が変わる可能性があるという問題はbase別として、グローバル環境に別のバージョンがある場合でも、常にバージョンを呼び出します。

于 2012-06-16T19:23:16.877 に答える