xml2
xml2 copied to clipboard
VECTOR_ELT() can only be applied to a 'list', not a 'logical'
Found this by mistake, probably a friendlier error is warranted:
xml_find_all(read_xml("<a line1='1'></a>"), "@line1 = 1")
# Error in xml_nodeset(nodes) :
# VECTOR_ELT() can only be applied to a 'list', not a 'logical'
Well, the issue is like so:
xml_find_all()
evaluates the XPath search to a logical vector on which xml_nodeset()
is attempted:
https://github.com/r-lib/xml2/blob/ab2078976c9ab57116c7c9175632e7d19d45273f/R/xml_find.R#L87-L90
xml_nodeset()
attempts the node_duplicated
routine:
https://github.com/r-lib/xml2/blob/2f3da489f58c707a283a6bb816d12a3df62996b2/R/classes.R#L76
Which attempts the VECTOR_ELT()
call:
https://github.com/r-lib/xml2/blob/2f3da489f58c707a283a6bb816d12a3df62996b2/src/xml2_node.cpp#L560
It's easy enough to throw a stopifnot(is.list(.))
somewhere, but I do pause to wonder the expected behavior in this case. What should xml_find_all()
do when the search result is a logical vector?
On the one hand, the XPath search executed successfully, so it seems like a waste to trigger an error. OTOH, it may be peculiar to allow xml_find_all()
to return a variety of types.