我的目标是创建一个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软件包,但是如果可以使用另一个软件包找到解决方案,那么我也会对此开放。
非常有帮助!
答案 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>