在不使用循环的情况下将多个子项添加到xml对象

时间:2018-10-23 19:58:03

标签: r xml apply xml2

我的目标是创建一个xml对象,其中包含多个元素,每个元素包含不同的信息。 xml对象看起来像一个简单的例子:

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循环添加了孩子:

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的方式使用数据框中的数据一次创建多个子级?

我尝试了各种选项,但没有一个成功,而且我不确定是否足够接近可以在此处发布这些选项中的任何一个。当前,我正在使用xml2软件包,但是如果可以使用另一个软件包找到解决方案,那么我也会对此开放。

非常有帮助!

1 个答案:

答案 0 :(得分:1)

以下似乎正在按照您的要求进行操作,根据要求使用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>