You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:37:33