您如何编写包装函数或类来将数字格式化为R中的百分比,货币等?

And*_*rie 11 r number-formatting

在上一个问题中,我询问基本R中是否存在方便的包装器以将数字格式化为百分比.

这引起了三个回应:

  1. 可能不是.
  2. 这样的包装器太窄而无法使用.useRs最好学习如何使用现有工具,例如sprintf,可以高度灵活地格式化数字.
  3. 无论如何,这样的包装器是有问题的,因为您失去了对对象执行计算的能力.

不过,在我看来,这个sprintf函数对于R初学者来说只是有点过于模糊(除非它们来自C背景).也许更好的解决方案是修改formatprettyNum添加前缀和后缀的选项,这样您就可以轻松创建百分比,货币,度数等.


题:

您将如何设计一个函数,类或一组函数来优雅地处理格式数字作为百分比,货币,度数等?

Rei*_*son 10

我可能会把事情弄得很简单.format()通常对大多数基本的格式化需求很有用.我会用一个允许任意prefixsuffix字符串的简单包装来扩展它.这是一个简单的版本:

formatVal <- function(x, prefix = "", suffix = "", sep = "", collapse = NULL,
                      ...) {
    x <- format(x, ...)
    x <- paste(prefix, x, suffix, sep = sep, collapse = collapse)
    x
}
Run Code Online (Sandbox Code Playgroud)

如果我真的这样做,我可能不会collapse在定义中有这个参数formatVal(),而是处理它...,但为了说明我保持上述功能简单.

使用:

set.seed(1)
m <- runif(5)
Run Code Online (Sandbox Code Playgroud)

一些简单的用法示例

> formatVal(m*100, suffix = "%")
[1] "26.55087%" "37.21239%" "57.28534%" "90.82078%" "20.16819%"
> formatVal(m*100, suffix = "%", digits = 2)
[1] "27%" "37%" "57%" "91%" "20%"
> formatVal(m*100, suffix = "%", digits = 2, nsmall = 2)
[1] "26.55%" "37.21%" "57.29%" "90.82%" "20.17%"
> formatVal(m, prefix = "£")
[1] "£0.2655087" "£0.3721239" "£0.5728534" "£0.9082078" "£0.2016819"
> formatVal(m, prefix = "£", digits = 1)
[1] "£0.3" "£0.4" "£0.6" "£0.9" "£0.2"
> formatVal(m, prefix = "£", digits = 1, nsmall = 2)
[1] "£0.27" "£0.37" "£0.57" "£0.91" "£0.20"
Run Code Online (Sandbox Code Playgroud)


Jam*_*mes 8

print.formatted <- function(x)
{
   print(paste(attr(x,"prefix"), sprintf(x*attr(x,"scaleFactor"),fmt=paste("%.",attr(x,"precision"),"f",sep="")), attr(x,"suffix"), sep=""))
}

as.percent <- function(x,precision=3)
{
  class(x) <- c(class(x),"formatted")
  attr(x,"scaleFactor")<-100
  attr(x,"prefix")<-""
  attr(x,"suffix")<-"%"
  attr(x,"precision")<-precision
  return(x)
}

as.currency <- function(x,prefix="£")
{
  class(x) <- c(class(x),"formatted")
  attr(x,"scaleFactor")<-1
  attr(x,"prefix")<-prefix
  attr(x,"suffix")<-""
  attr(x,"precision")<-2
  return(x)
}

as.percent(runif(3))
[1] "21.585%" "12.396%" "37.744%"

x <- as.currency(rnorm(3,500,100))
x
[1] "£381.93" "£339.49" "£521.74"
2*x
[1] "£763.86"  "£678.98"  "£1043.48"
Run Code Online (Sandbox Code Playgroud)