r - 用胶水补零
问题描述
我想用来glue
完成sprintf('%02d', x)
,但我不确定这是否可能。
vignette('transformers')
建议一个sprintf
类似的变压器sprintf_transformer
和“前端”包装器glue_fmt
,如下所示:
sprintf_transformer <- function(text, envir) {
m <- regexpr(":.+$", text)
if (m != -1) {
format <- substring(regmatches(text, m), 2)
regmatches(text, m) <- ""
res <- eval(parse(text = text, keep.source = FALSE), envir)
do.call(sprintf, list(glue("%{format}f"), res))
} else {
eval(parse(text = text, keep.source = FALSE), envir)
}
}
glue_fmt <- function(..., .envir = parent.frame()) {
glue(..., .transformer = sprintf_transformer, .envir = .envir)
}
然后举一个简单的例子:
glue_fmt("π = {pi:.2}")
#> π = 3.14
这似乎依赖惰性评估将调用pi:.2
(这是有效的 R 语法)拆分为对sprintf
:的调用sprintf('%.2f', pi)
。
然而,在我看来,这对于 0 填充的情况是不可能的,因为 R 解析器将消除任何前导 0:
pid = as.integer(pi)
glue_fmt('{pid:02}')
# 3.000000
# vs desired
sprintf('%02d', pid)
# [1] "03"
查看sprintf_transformer
,f
是硬编码的,因为02d
and.2f
本身不是有效的 R 语法。我想我们可以glue_fmtd
为glue_fmtf
supply or 添加一个参数'd'
,但与 plain 相比'f'
,这已经使便利因素变得紧张了。glue_fmt
sprintf
这仍然无法克服 R 解析器的基本约束——一旦02
被视为 R 代码,解析器将丢弃前导 0。
所以,我被困住了——是否有可能以glue
一种不太复杂的方式来使用零填充格式?
解决方案
我认为您在变压器中不需要有效的 R 语法。字符串作为字符串处理。你不需要硬核 f 或 d。例如,如果您有
sprintf_transformer <- function(text, envir) {
m <- regexpr(":.+$", text)
if (m != -1) {
format <- substring(regmatches(text, m), 2)
regmatches(text, m) <- ""
res <- eval(parse(text = text, keep.source = FALSE), envir)
do.call(sprintf, list(glue("%{format}"), res))
} else {
eval(parse(text = text, keep.source = FALSE), envir)
}
}
然后你可以做
glue_fmt('{pid:02d}')
# 03
glue_fmt('{pid:0.02f}')
# 3.00
推荐阅读
- google-apps-script - 是否有 API 函数可以用来评论 Google Photos 上的相册
- kubernetes - 获取 https://[10.96.0.1]:443/apis/crd.projectcalico.org/v1/clusterinformations/default: dial tcp 10.96.0.1:443: i/o timeout]
- javascript - GraphQL - 嵌套查询的最佳实践是什么?
- c++ - c ++读取大量文件的一小部分
- c# - Selenium 单击 href 中的链接
- mysql - 在复合主键表的数据查询中获取 vs filter_by
- css - 为什么 scss 文件在 laravel 6 中不起作用?
- javascript - Material UI (Scrollspy) - React - 使用标签在列表中移动并自动滚动到索引
- android - Cardboard-xr-plugin 导致 VR 环境在移动相机时卡顿
- ubuntu - 如何使用 Kotlin 的反射?