R 在开关中强制输入空白变量名

R 在开关中强制输入空白变量名,r,function,switch-statement,R,Function,Switch Statement,我编写了这个小实用程序函数来很好地格式化货币值: 代码 问题 我想将100显示为.100。问题是,我正在使用开关来选择后缀,而不能将“用作变量名。到目前为止,我能够强制“quot作为变量名,它给出: >> money_format(10) [1] "£10_" 但我不想要,我想要10英镑。问题是我不能有: scale = switch( suffixes[div], "" = 1,

我编写了这个小实用程序函数来很好地格式化货币值:

代码 问题 我想将
100
显示为
.100
。问题是,我正在使用
开关
来选择后缀,而不能将
用作变量名。到目前为止,我能够强制
“quot
作为变量名,它给出:

>> money_format(10)
[1] "£10_"
但我不想要,我想要10英镑。问题是我不能有:

   scale = switch(
                  suffixes[div],
                  "" = 1,
                # ^ - this fails
期望的解决方案 我不想重写此函数,是否有一些技巧可以用来打印我的
switch
语句中
“”=1
的空格?

类似这样的东西:

money_format <- function(x, include_pound_sign = TRUE, digits = 3) {
  stopifnot(is.numeric(x))

  # As per: https://stackoverflow.com/a/28160474/1655567
  f <-
    function(x) {
      div <- findInterval(x, c(1, 1e3, 1e6, 1e9, 1e12))
      suffixes <- c("_", "K", "m", "bn", "T")

      scale = switch(
        suffixes[div],
        "_" = 1,
        K = 1e-3,
        m = 1e-6,
        bn = 1e-9,
        "T" =  1e-12
      )

      if(scale == 1){
        suffixes[1] = ""
      }

      paste0({
        if (include_pound_sign) {
          intToUtf8(163)
        }
      }
      , (
        scales::unit_format(
          unit = suffixes[div],
          scale = scale,
          sep = "",
          digits = digits
        )
      )(x))
    }

  vf <- Vectorize(FUN = f, "x")

  vf(x)
}

这将为
开关
使用默认值
1
,并允许
后缀为零长度字符串

money_format <- function(x, include_pound_sign = TRUE, digits = 3) {
  stopifnot(is.numeric(x))
  div <- findInterval(x, c(1, 1e3, 1e6, 1e9, 1e12))
  suffixes <- c("", "K", "m", "bn", "T")
  sapply(seq_along(div), function(y) {
    sprintf("%s%s",
            ifelse(include_pound_sign, intToUtf8(163), NULL),
            scales::unit_format(
              unit = suffixes[div][y],
              scale = switch(
                suffixes[div][y],
                K = 1e-3,
                m = 1e-6,
                bn = 1e-9,
                "T" =  1e-12,
                1),
              sep = "",
              digits = digits
            )(x[y]))
    })
  }

val <- c(1.235e3, 1e6, 1009, 10)
money_format(val)
[1] "£1.24K" "£1m"    "£1.01K" "£10"  

money\u格式使用“”而不是“\u”?然后你得到“10英镑”。或者使用像gsub(““,”,x,fixed=TRUE)@Koot6133是的,
可以做到,我希望有一些技巧可以得到
”<10“
,但也许我把事情复杂化了。是的,为什么不呢。我想,对于这个问题,我是在寻找一个奇特的解决方案,并且不必要地将问题过度复杂化。@Konrad我同意这是一种解决方法,但这种方法的好处是,只要在
if
语句中更改
开关,您就不必再担心它会花费多少时间。
money_format <- function(x, include_pound_sign = TRUE, digits = 3) {
  stopifnot(is.numeric(x))

  # As per: https://stackoverflow.com/a/28160474/1655567
  f <-
    function(x) {
      div <- findInterval(x, c(1, 1e3, 1e6, 1e9, 1e12))
      suffixes <- c("_", "K", "m", "bn", "T")

      scale = switch(
        suffixes[div],
        "_" = 1,
        K = 1e-3,
        m = 1e-6,
        bn = 1e-9,
        "T" =  1e-12
      )

      if(scale == 1){
        suffixes[1] = ""
      }

      paste0({
        if (include_pound_sign) {
          intToUtf8(163)
        }
      }
      , (
        scales::unit_format(
          unit = suffixes[div],
          scale = scale,
          sep = "",
          digits = digits
        )
      )(x))
    }

  vf <- Vectorize(FUN = f, "x")

  vf(x)
}
> money_format(10)
[1] "£10"
> money_format(100)
[1] "£100"
> money_format(1000)
[1] "£1K"
> money_format(10000)
[1] "£10K"
> money_format(100000)
[1] "£100K"
money_format <- function(x, include_pound_sign = TRUE, digits = 3) {
  stopifnot(is.numeric(x))
  div <- findInterval(x, c(1, 1e3, 1e6, 1e9, 1e12))
  suffixes <- c("", "K", "m", "bn", "T")
  sapply(seq_along(div), function(y) {
    sprintf("%s%s",
            ifelse(include_pound_sign, intToUtf8(163), NULL),
            scales::unit_format(
              unit = suffixes[div][y],
              scale = switch(
                suffixes[div][y],
                K = 1e-3,
                m = 1e-6,
                bn = 1e-9,
                "T" =  1e-12,
                1),
              sep = "",
              digits = digits
            )(x[y]))
    })
  }

val <- c(1.235e3, 1e6, 1009, 10)
money_format(val)
[1] "£1.24K" "£1m"    "£1.01K" "£10"