在R中使用glue生成YAML时,如何为字符串值保留引号?
如何让glue生成的字符串在YAML中带引号且无多余空格?
问题场景
你想用glue生成字符串并存入YAML,但生成的YAML里值没有引号,不符合预期。原始代码如下:
library(yaml) library(glue) begin <- 1970 end <- 2020 yaml <- list(year = glue('between {begin} and {end}')) yaml_text <- as.yaml(yaml) cat(as.character(yaml_text), sep = "\n", file = "test.yaml", append = TRUE)
生成的YAML内容:
year: between 1970 and 2020
你尝试在glue内容前加空格,虽然能触发引号,但会带来多余空格:
library(yaml) library(glue) begin <- 1970 end <- 2020 yaml <- list(year = glue(' between {begin} and {end}')) # 加了空格 yaml_text <- as.yaml(yaml) cat(as.character(yaml_text), sep = "\n", file = "test.yaml", append = TRUE)
生成的内容:
year: ' between 1970 and 2020'
原因说明
yaml包默认遵循YAML规范,只有当字符串必须用引号包裹时才会自动添加引号——比如字符串开头有空格、包含特殊字符、属于YAML关键字等。你的原始字符串是普通文本,所以被识别为不需要引号,自动省略了。
解决方案
有两种简单方法可以实现需求:
方法1:强制所有字符串加引号
使用as.yaml()的quoting参数,设置为"all"即可强制所有字符串字段添加引号:
library(yaml) library(glue) begin <- 1970 end <- 2020 yaml <- list(year = glue('between {begin} and {end}')) yaml_text <- as.yaml(yaml, quoting = "all") # 新增quoting参数 cat(yaml_text, file = "test.yaml")
生成的YAML内容:
year: 'between 1970 and 2020'
方法2:标记字符串为“原样保留”
用I()函数将glue生成的字符串标记为“不解析的原始对象”,yaml包会自动为其添加引号:
library(yaml) library(glue) begin <- 1970 end <- 2020 # 先转成character再用I()包裹 yaml <- list(year = I(as.character(glue('between {begin} and {end}')))) yaml_text <- as.yaml(yaml) cat(yaml_text, file = "test.yaml")
生成的结果和方法1一致,符合预期。
内容的提问来源于stack exchange,提问作者Quinten
相关产品推荐
相关产品推荐

