对于依赖研究数据的软件包,R中是否有设施进行定期检查以确定是否已进行更新,或者网站与软件包之间是否存在差异?
这是一个可重复的例子。以下函数返回网页上存在数据的年份集。数据本身可以从站点下载,并在不同的功能中完成。 check
将是一种在其他函数中处理参数匹配错误的方法。
check <- function ()
{
doc <- htmlTreeParse("http://www.retrosheet.org/events",
useInternalNodes = TRUE)
on.exit(free(doc))
xv <- sapply(doc["//a"], xmlValue)
gg <- xv[grepl("eve.zip", xv, fixed = TRUE)]
res <- gsub("(s?)eve.zip", "", gg)
as.numeric(unique(res))
}
结果的一个子集是
> library(XML)
> check()[1:5]
# [1] 1920 1921 1922 1927 1930
请注意,这不是序列。数据可能会在以后添加到网站,结果中可能会出现新的年份。如果我将可用年份存储为包对象,我将不知道已对数据进行了更新。
速度简介
> system.time({ check() })
# user system elapsed
# 0.060 0.003 0.875
这并不慢,但使用此检查的功能可以在没有它的情况下提高效率,因为在check
确保它存在后,它也会到同一站点下载数据。
答案 0 :(得分:3)
很多以前,我实际上是为了一个非常类似的任务编写了digest包。
事实证明,许多软件包在数据集比较方面有类似的需求,这是digest软件包最终被许多数据缓存软件包使用的方式,或者由knitr看看是否有变化等等。
因此,如果您在R中有数据,请考虑比较摘要校验和。也就是说,这仍然需要访问之前的和数据集之后的来确定它们是否已经改变 - 并且可能还有其他方式。但是digest提供了一种相对广泛使用的基于完整对象序列化校验和的比较方法。
答案 1 :(得分:2)
您可以查看我的UNF包,该包实现了数据集的通用数字指纹算法。它主要是为data.frames设计的,但也适用于矢量:
> library("UNF")
> unf(z)
Universal Numeric Fingerprint (Truncated): UNF:5:Iw2Mw/fiLQ+OzNrOtolwFw==
就像@ DirkEddelbuettel的回答一样,这是原始数据的哈希值(并且依赖于library("digest")
)。该算法在GitHub上描述。
简而言之,如果UNF签名发生变化,数据就会发生变化。如果您正在使用数据框,那么软件包中还有一些功能可用于比较数据框并查找哪些变量/列不同。