我想从 R 中的 YAML 中删除一些空元素。空元素可以像[]
在 yaml 中一样显示。我找到了ymlthis
带有该 yml_discard(~is_yml_blank(.x))
选项的包。这应该会从 yaml 中删除空元素,但这不起作用。这是一个可重现的示例:
library(yaml)
library(ymlthis)
z <- yaml.load(
"tree:
format: newick
tracks:
- class: colorstrip
rel_height: []
title: ")
y <- as.yaml(z)
y |>
yml_discard(~is_yml_blank(.x))
#> ---
#> tree:
#> format: newick
#> tracks:
#> - class: colorstrip
#> rel_height: []
#> title: null
#> ---
创建于 2024-11-08,使用reprex v2.1.1
如您所见,它不会删除空值。我的预期输出应如下所示:
#> ---
#> tree:
#> format: newick
#> tracks:
#> - class: colorstrip
#> ---
预期输出显示应删除没有值的元素。所以我想知道是否有人知道如何在 R 中删除 YAML 文件中的空元素?
使用
z
(一棵树,或者用 R 术语来说,任意深度嵌套列表)似乎比y
使用 (字符串(或长度为 1 的字符向量))更容易。例如,使用rrapply::rapply()
修剪 中的任何空元素z
,然后转换为 yaml 字符串:返回:
我们
purrr
也可以选择modify_tree()
+compact()
:创建于 2024-11-08,使用reprex v2.1.1
您需要遍历列表的每一层
yml_discard()
仅考虑 yaml 的顶层。要执行所需的操作,您需要遍历列表的深度,并在遍历过程中丢弃空项。我们可以使用该purrr
库来实现这一点。顺便说一句,这个例子不需要
yaml
库 - 您可以直接在文本中读取ymlthis::as_yml()
:如上所述,
yml_discard()
仅考虑 yaml 的顶层:创建自调用函数
drop_all_empty()
是删除列表顶层所有零长度项的函数,然后将自身应用于列表内所有剩余列表。非列表项将直接返回。最后,因为的输出
drop_all_empty()
将是一个列表,我们可以创建一个小包装器,将列表转换回 yaml:创建于 2024-11-08,使用reprex v2.1.1