Добавить несколько дочерних объектов в объект XML без использования цикла - PullRequest
0 голосов
/ 23 октября 2018

Моя цель - создать объект 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 голосов
/ 23 октября 2018

Следующее, кажется, делает то, что вы хотите, используя 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>
...