在不使用循环的情况下将多个 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>
我的 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>