2016-03-07 84 views
2

我想用pandoc.tables(我使用pander)很好地显示大量数字,同时编织html或pdf。在pandoc.table中使用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 

但没有成功。

有没有办法让这项工作?我接受pander以外的解决方案,但是kable似乎与我的R版本(R版本3.2.3)不兼容。

回答

0

print.million方法对pander没有影响,这是一种不同的方法S3 - 所以你必须在这里定义pander.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 
---------------------------- 
+0

我很抱歉,我忘了补充一个例子。但实际上很简单:我尝试了'x' vs'pandoc.table(x)'。我想避免预处理数据框架,因为这样我就失去了处理数据的能力,因为它们是现在的字符。 – paulwasit

+0

或者在你的例子中,我想要显示'pandoc.table(c(sum(millions),sum(billionions))'作为类'百万'返回。预处理数据框意味着失去操作数据的能力为他们现在是字符 – paulwasit

+0

@paulwasit我几乎写道,“pander”将最终对象作为降价表进行报告,因此不会有任何进一步的数据操作 - 但有第二个想法表明有一个'pander'包中的'formatter'选项确实非常有用。请问您可以在[GH](https://github.com/Rapporter/pander)上打开一张票吗? – daroczig