У меня проблема с использованием lapply
и xml_find_first
из пакета xml2
для извлечения узлов из списка объектов XML. Я извлекаю несколько тысяч записей из Scopus API. Поскольку я могу получить только 25 записей одновременно, я запускаю его, поэтому получаю список из 100+ элементов по 25 записей в каждой. Я знаю, что в некоторых записях пропущены значения, поэтому моя цель - перемешать, пока я не получу список, в котором каждая запись является отдельным элементом, а затем используйте lapply
и xml_find_first
, чтобы получить нулевые значения, где подходящее. Проблема в том, что я получаю повторяющиеся значения, как будто все еще вложено в их начальные списки.
Вот воспроизводимый пример со списком из 2 элементов по 2 записи в каждом, из которых citedby-count
отсутствует в последнем:
```{r}
library(xml2)
# Simulate how data come in from Scopus
# Build 2 list elements, 2 entries each
el1 <- read_xml(
"<feed>
<blah>Bunch of stuff I don't need</blah>
<blah>Bunch of other stuff I don't need</blah>
<entry>
<eid>2-s2.0-1542382496</eid>
<citedby-count>9385</citedby-count>
</entry>
<entry>
<eid>2-s2.0-0032721879</eid>
<citedby-count>4040</citedby-count>
</entry>
</feed>"
)
el2 <- read_xml( # This one's missing citedby-count for last entry
"<feed>
<blah>Bunch of stuff I don't need</blah>
<blah>Bunch of other stuff I don't need</blah>
<entry>
<eid>2-s2.0-0041751098</eid>
<citedby-count>3793</citedby-count>
</entry>
<entry>
<eid>2-s2.0-73449149291</eid>
</entry>
</feed>"
)
# Combine into list
lst <- list(el1,el2)
# Check
lst
```
Это дает мне:
![enter image description here](https://i.stack.imgur.com/KiUxO.png)
Моя цель - вытащить записи, чтобы они были элементами списка. Таким образом, xml_find_first
должен вставить нулевое значение для записи, где отсутствует citedby-count
.
```{r}
# Pull entry nodes
lst2 <- lapply(lst, xml_find_all, "//entry")
# Unlist
lst2 <- unlist(lst2, recursive=FALSE)
# Check - each entry is its own element
lst2
```
![enter image description here](https://i.stack.imgur.com/q8vVi.png)
Зависание происходит, когда я пытаюсь извлечь узел, который, как мне известно, отсутствует в некоторых записях, таким образом, чтобы в результате его работы отсутствовал ноль. xml_find_first
должен сделать это. Но ...
```{r}
cbc <- lapply(lst2, xml_find_first, "//citedby-count")
cbc <- lapply(cbc, xml_text)
cbc # Repeats the first values of original nesting
```
![enter image description here](https://i.stack.imgur.com/YEBfG.png)
Итак, я проверил, что будет с xml_find_all
:
```{r}
cbc2 <- lapply(lst2, xml_find_all, "//citedby-count")
cbc2 <- lapply(cbc2, xml_text)
cbc2 # Elements contain all values from initial nesting
```
![enter image description here](https://i.stack.imgur.com/ChLG5.png)
Что не имеет смысла по сравнению с выводом lst2
выше. По какой-то причине при извлечении текста сохраняются значения из начального вложения, даже если он не отображается при просмотре окончательного списка объектов XML. Я в тупике.