是否有设施可以自动更新包数据?

时间:2014-07-25 21:00:08

标签: r

对于依赖研究数据的软件包,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确保它存在后,它也会到同一站点下载数据。

2 个答案:

答案 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签名发生变化,数据就会发生变化。如果您正在使用数据框,那么软件包中还有一些功能可用于比较数据框并查找哪些变量/列不同。