在不使用循环的情况下将多个 children 添加到 xml object

Add multiple children to an xml object without using a loop

我的 objective 是创建一个 xml object,它包含多个元素,每个元素包含不同的信息。 xml object 的一个简单例子是:

library(xml2)
x1 <- read_xml("<Diag><line level='3' description='a log message'/><line level='3' description='a second log message'/></Diag>")
message(x1)

输出:

<Diag>
 <line level="3" description="a log message"/>
 <line level="3" description="a second log message"/>
</Diag>

目前,我从名为 diag 的数据框中获取信息。我使用 for 循环添加 children:

library(xml2)
diag <- data.frame(level=c(3,3),description=c('a log message','a second log message'),stringsAsFactors = F)
x2 <- xml_new_root("Diag")
for (i in 1:dim(diag)[1]) {
xml_add_child(.x=x2,.value="line",level=diag$level[i],description=diag$description[i])
}
message(x2)

xml布局与x1相同。

但是,这个循环没有我希望的那么优雅,而且对于大型数据帧,可能会很慢。

我的问题是:有没有什么方法可以通过使用类似于 apply 的东西,使用数据框中的数据一次创建多个 children?

我尝试了各种选项,但 none 都成功了,我不确定我是否足够接近 post 这里的任何选项。目前,我正在使用 xml2 包,但如果可以使用另一个包找到解决方案,那么我也会接受它。

非常感谢您的帮助!

以下似乎是您想要的,按要求使用 sapply

x2 <- xml_new_root("Diag")
sapply(1:dim(diag)[1], function(i) {
  xml_add_child(.x=x2,.value="line",level=diag$level[i],description=diag$description[i])
}
)
message(x2)
<?xml version="1.0" encoding="UTF-8"?>
<Diag>
  <line level="3" description="a log message"/>
  <line level="3" description="a second log message"/>
</Diag>