Проблема в том, что as.yaml
уничтожает атрибуты, что отличает data.frame от списка в R
:
library(data.table)
library(yaml)
foo <- rbindlist(list(
data.table(env = "default", a = "low", x = "A", z = "low", i = 1, j = 1, k = 1),
data.table(env = "default", a = "low", x = "A", z = "medium", i = 1, j = 2, k = 1),
data.table(env = "default", a = c("low", "medium", "high"), x = "A", z = "high", i = 2, j = 1, k = 1),
data.table(env = "other", a = c("low", "medium", "high"), x = "B", z = "na", i = 2, j = 2, k = 2)
))
Так должны выглядеть атрибуты.
> attributes(foo)
$`names`
[1] "env" "a" "x" "z" "i" "j" "k"
$row.names
[1] 1 2 3 4 5 6 7 8
$class
[1] "data.table" "data.frame"
$.internal.selfref
<pointer: 0x0000000002521ef0>
И вот как они выглядят.
foo2 <- as.yaml(foo)
# cat(out)
bar <- yaml::yaml.load(foo2)
> attributes(bar)
$`names`
[1] "env" "a" "x" "z" "i" "j" "k"
Таким образом, преобразование в data.frame так же просто, как:
attributes(bar)$class <- "data.frame"
attributes(bar)$row.names <- seq_along(bar[, 2])
Или в данные.стол:
attributes(bar)$class <- "data.frame"
bar <- as.data.table(bar)