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"