2

カスタムクラスを使用して、htmlまたはpdfを編成しながら、pandoc.tables(私はpanderを使用しています)で多数をうまく表示したいと思います。

この SO questionのおかげで、コンソールでうまく印刷する方法を見つけました。

この例では、 x を印刷すると 6M 75M 743.5M 0.3M 4.3M が返されます。

print.million <- function(x, ...) {
    x <- paste0(round(x / 1e6, 1), "M")
    NextMethod(x, quote = FALSE, ...)
}
x <- c(6e+06, 75000400, 743450000, 340000, 4300000)
class(x) <- "million"
x

しかし、このフォーマットは pandoc.table で消えます: 元のフォーマットされていない値が表示されます。カスタムフォーマットも試しました(上記のSOの質問の回答):

format.million <- function(x,...)paste0(round(unclass(x) / 1e6, 1), "M")
as.data.frame.million <- base:::as.data.frame.factor

しかし、成功せずに。

これを機能させる方法はありますか?私はパンダー以外のソリューションを受け入れていますが、ケーブルは私のバージョンの R (R バージョン 3.2.3) と互換性がないようです。

4

1 に答える 1

0

このメソッドは、別の S3 メソッドである にはprint.million影響しません。したがって、ここで定義する必要があります。panderpander.million

> x <- c(6e+06, 75000400, 743450000, 340000, 4300000)
> pander(x)
_6000000_, _75000400_, _743450000_, _340000_ and _4300000_

> pander.million <- function(x, ...) pander(paste0(round(x / 1e6, 1), "M"))
> class(x) <- 'million'
> pander(x)
_6M_, _75M_, _743.5M_, _0.3M_ and _4.3M_

しかし、これをテーブル内で使用するには、列のクラスをpandoc.tableどのように設定するかわかりません。million再現可能な例を教えてください。

しかし、例えば、あなたは前処理することができますdata.frame:

> x <- as.numeric(x)
> df <- data.frame(millions = x, billions = x * 1e3, text = 'foobar')
> numbers <- names(df)[sapply(df, is.numeric)]
> df[numbers] <- apply(df[, numbers, drop = FALSE], 1,
+                      function(x) paste0(round(x / 1e6, 1), "M"))
> pander(df, justify = 'right')

----------------------------
  millions   billions   text
---------- ---------- ------
        6M    743450M foobar

     6000M       0.3M foobar

       75M       340M foobar

  75000.4M       4.3M foobar

    743.5M      4300M foobar
----------------------------
于 2016-03-08T00:18:19.713 に答える