在包中XML,在?htmlParse 示例部分中,是以下函数getLinks().
getLinks <- function() {
links <- character()
list(a = function(node, ...) {
links <<- c(links, xmlGetAttr(node, "href"))
node
},
links = function()links)
}
Run Code Online (Sandbox Code Playgroud)
使用它,然后盯着它看了一会儿,我仍然无法绕着函数体内发生的事件序列.
> 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>
Run Code Online (Sandbox Code Playgroud)
有人可以提供此功能中发生的事件链的详细说明吗?
对于示例,请运行以下代码:
> library(XML)
> URL <- "http://www.retrosheet.org/game.htm"
> h1 <- getLinks()
> htmlTreeParse(URL, handlers = h1)
> h1$links()
Run Code Online (Sandbox Code Playgroud)
在它自己的功能上真的没有多大作用.它真的只在上下文中有用htmlTreeParse.它做的是两件事.首先,它创建一个机箱/环境,其中将收集链接向量.其次,它返回一个可以用作handler=in 的列表htmlTreeParse.根据文档,处理程序是一个
用于将不同XML节点映射到R对象的可选函数集合.通常,这是一个命名的函数列表,闭包可用于提供本地数据.这提供了一种在R中创建树时添加或删除节点的过滤树的方法,并且通常在C代码中构造它们时对它们进行处理.
因此,htmlTreeParse将在列表中查找与HTML文件中元素的节点名称匹配的名称.因此,由于列表具有"a"元素,因此将为<a>文档中的每个(链接)标记调用该函数.该函数只是提取href存储URL 的属性,并将其添加到links机箱中的阵列.
最后,在完成解析之后,您需要一种能够links在闭包内访问该向量的方法.因此该列表还定义了"链接"元素.这是一个只返回受保护矢量的函数.只要它与HTML文档中的标记名称不匹配,您就可以调用此函数.
所以这个getLinks()函数只返回一个可以用作处理程序的列表.大多数实际工作都是在htmlTreeParse函数中完成的.