R 替换 YAML 中的引用值

R replace quoted values in YAML

我正在替换 Yaml 文件中的值,需要选择要引用的值。

我不理解 write.yaml

当前的行为
library(yaml)
test <- list("a"=list("b"="123", "c"="rabbitmq"))
as.yaml(test)
write_yaml(test, "test.yaml")

test.yaml 中,"123" 被引用而 rabbitmq 不是。我怎样才能刻意选择要引用的内容?

解决方法

虽然对于更复杂的 YAML 文件输出来说这可能很困难,但是对于 yaml 包明显无法强制引用的问题,有一种解决方法,如下所述。在这个例子中,我们可以使用正则表达式来匹配任何 non-quoted 连续的字母或数字组,并在其周围强制引号。

library(stringr)

test <- list("a"=list("b"=123L, "c"="rabbitmq", d = "Yes"))
test_yaml <- as.yaml(test)
test_yaml
#> [1] "a:\n  b: 123\n  c: rabbitmq\n  d: 'Yes'\n"

我们可以在这里看到我们可能想要引用 123rabbitmqYes 已经在引号中)。

test_yaml <- str_replace_all(test_yaml, "(?<=:\s)([a-zA-Z0-9]*?)(?=\n)", "'\1'")
test_yaml
#> [1] "a:\n  b: '123'\n  c: 'rabbitmq'\n  d: 'Yes'\n"

然后将其写入您的 YAML 文件。

write_yaml(test_yaml, "/Users/caldwellst/Desktop/test.yaml")

然后我们得到你想要的输出。

  a:
    b: '123'
    c: 'rabbitmq'
    d: 'Yes'

yaml 包

write_yaml 使用字符串强制引号,否则 123 将被解释为数字。 rabbitmq 不需要引号,因为它会自动被解释为字符串。如果你真的希望 123 被解释为数字,就这样传递它。

test <- list("a"=list("b"=123, "c"="rabbitmq"))
as.yaml(test)
write_yaml(test, "test.yaml")

然后你得到:

a:
  b: 123.0 # pass b as 123L to force integer output
  c: rabbitmq

根据 write_yaml 的文档:

Character vectors that have a class of ‘verbatim’ will not be quoted in the output YAML document except when the YAML specification requires it

虽然这是一种强制输出不带引号的特定值的方法,但似乎没有简单的方法来强制对值进行引号。我试过在字符串中传递 unicode = T 和显式引号,但它们被删除了。同样,我试图通过传入各种处理程序来操纵 class(并删除 verbatim(如果它在那里)来欺骗系统。但是,none 似乎有效。因为源代码是在 C 中,无法使用 write_yaml 函数。

great SO post 中有关于 YAML 语法和一般引用的详细答案。