在R中移除YAML空元素:ymlthis方法无效求解决方案
如何在R中移除YAML中的空元素(包括
[]和空值) 问题描述
尝试移除YAML中的空元素(如[]空向量、无值的键)时,使用ymlthis包的yml_discard(~is_yml_blank(.x))方法未生效。可复现代码如下:
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 #> ---
期望输出是移除所有无值元素:
--- tree: format: newick tracks: - class: colorstrip ---
解决方案
问题出在is_yml_blank()的判断逻辑未覆盖空向量([])和解析后的null值。需要自定义递归函数,遍历嵌套的YAML结构,过滤掉所有空元素:
步骤1:定义递归过滤函数
该函数会递归处理嵌套列表,移除null、空向量、空字符串类型的元素:
library(purrr) discard_empty <- function(x) { # 递归处理嵌套列表 if (is.list(x)) { x <- map(x, discard_empty) # 过滤空元素:null、空向量、空字符串 x <- discard(x, ~is.null(.x) || (is.vector(.x) && length(.x) == 0) || (is.character(.x) && .x == "")) } x }
步骤2:应用函数并生成清理后的YAML
直接对解析后的列表进行处理,再转换为YAML格式:
# 清理空元素 clean_z <- discard_empty(z) # 生成最终YAML cat(as.yaml(clean_z))
运行后输出:
--- tree: format: newick tracks: - class: colorstrip ---
解释
- 原方法失效原因:
is_yml_blank()仅识别ymlthis包定义的"空白"类型(如空的yml对象),不包含普通R对象中的空向量、null或空字符串。 - 递归函数的作用:YAML结构通常是嵌套的,递归处理能确保所有层级的空元素都被过滤,包括列表中的子元素。
内容的提问来源于stack exchange,提问作者Quinten
相关产品推荐
相关产品推荐

