Gostaria de remover alguns elementos vazios de um YAML em R. Elementos vazios podem ser mostrados como []
em um yaml. Encontrei o ymlthis
pacote com a yml_discard(~is_yml_blank(.x))
opção. Isso deve remover os elementos vazios do yaml, mas não funciona. Aqui está um exemplo reproduzível:
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
#> ---
Criado em 2024-11-08 com reprex v2.1.1
Como você pode ver, ele não remove os valores vazios. Minha saída esperada deve ser parecida com esta:
#> ---
#> tree:
#> format: newick
#> tracks:
#> - class: colorstrip
#> ---
A saída esperada mostra que os elementos sem valor devem ser removidos. Então, eu queria saber se alguém sabe como remover elementos vazios em um arquivo YAML em R?
Parece mais fácil trabalhar com
z
, que é uma árvore (ou em termos de R uma lista aninhada de profundidade arbitrária), do quey
, que é uma string (ou vetor de caracteres de comprimento um). Por exemplo, userrapply::rapply()
para podar quaisquer elementos vazios dez
, então converta para uma string yaml:Isso retorna:
Com
purrr
também poderíamos optar pormodify_tree()
+compact()
:Criado em 2024-11-08 com reprex v2.1.1
Você precisa iterar por todos os níveis da lista
yml_discard()
considera apenas o nível superior do seu yaml. Para fazer o que você quer, você precisará iterar pela profundidade da lista e descartar itens vazios conforme avança. Podemos usar apurrr
biblioteca para isso.Aliás, você não precisa da
yaml
biblioteca para este exemplo - você pode ler seu textoymlthis::as_yml()
diretamente com:Conforme observado acima,
yml_discard()
considere apenas o nível superior do seu yaml:Crie uma função de auto-invocação
drop_all_empty()
é uma função que descarta todos os itens de comprimento zero do nível superior da lista e, então, se aplica a todas as listas restantes dentro da lista. Itens que não são da lista são simplesmente retornados.Por fim, como a saída de
drop_all_empty()
será uma lista, podemos criar um pequeno wrapper que converte a lista de volta para yaml:Criado em 2024-11-08 com reprex v2.1.1