XML 包中,在 ?htmlParse 示例 部分中,是以下函数 getLinks()

getLinks <- function() {
       links <- character()
       list(a = function(node, ...) {
                   links <<- c(links, xmlGetAttr(node, "href"))
                   node
                },
            links = function()links)
     }

在使用它之后,然后盯着它看了一会儿,我仍然无法理解函数体中发生的事件序列。
> bod <- as.list(body(getLinks))
> c(bod, rapply(bod, as.list))
[[1]]
`{`

[[2]]
links <- character()

[[3]]
list(a = function(node, ...) {
    links <<- c(links, xmlGetAttr(node, "href"))
    node
}, links = function() links)

$a
function (node, ...)
{
    links <<- c(links, xmlGetAttr(node, "href"))
    node
}
<environment: 0x595f7f0>

$links
function ()
links
<environment: 0x595f7f0>

有人能详细解释一下这个函数中发生的事件链吗?

对于示例,请运行以下代码:
> library(XML)
> URL <- "http://www.retrosheet.org/game.htm"
> h1 <- getLinks()
> htmlTreeParse(URL, handlers = h1)
> h1$links()

最佳答案

就其本身而言,该功能确实没有太大作用。它真的只在 htmlTreeParse 的上下文中有用。它所做的是两件事。首先,它创建一个围栏​​/环境,在其中收集链接向量。其次,它返回一个列表,该列表可以用作 handler= 中的 htmlTreeParse 。根据文档,处理程序是



因此 htmlTreeParse 将在列表中查找与 HTML 文件中元素的节点名称匹配的名称。因此,由于列表有一个“a”元素,因此将为文档中的每个 <a>(链接)标签调用该函数。该函数只是提取存储 URL 的 href 属性,并将其添加到 shell 中的 links 数组中。

最后,解析完成后,您需要一种能够访问闭包内的 links 向量的方法。因此该列表还定义了一个“链接”元素。这是一个只返回 protected 向量的函数。您可以随意调用此函数,只要它与 HTML 文档中的标记名称不匹配即可。

所以这个 getLinks() 函数只返回一个可以用作处理程序的列表。大多数实际工作是在 htmlTreeParse 函数中完成的。

10-08 03:05