这是情况。我的R
代码应该检查应用程序缓存RData
中的现有文件是否是最新的。我通过保存名称由特定数据元素的编码名称组成的文件来做到这一点。但是,通过为每个元素提交特定的 SQL 查询来检索与这些元素中的每一个相对应的数据,所有这些都在数据集合的配置文件中指定。因此,在检索元素数据但之后我不得不更改特定 SQL 查询的情况下,数据不会被更新。base64
为了处理这种情况,我决定使用R
对象的属性。我打算将每个数据对象对应的 SQL 查询(request
)——base64
编码——保存为对象的属性:
# save hash of the request's SQL query as data object's attribute,
# so that we can detect when configuration contains modified query
attr(data, "SQL") <- base64(request)
然后,当我需要验证 SQL 是否已被查询更改时,我想简单地检索对象的相应属性,并将其与当前 SQL 查询的哈希进行比较。如果它们匹配 - 查询未更改,我跳过处理此数据请求,如果它们不匹配 - 查询已更改,我继续处理请求:
# check if the archive file has already been processed
if (DEBUG) {message("Processing request \"", request, "\" ...")}
if (file.exists(rdataFile)) {
# now check if request's SQL query hasn't been modified
data <- load(rdataFile)
if (identical(base64(request), attr(data, "SQL"))) {
skipped <<- skipped + 1
if (DEBUG) {message("Processing skipped: .Rdata file found.\n")}
return (invisible())
}
rm(data)
}
我的问题是是否可以在不从文件中完全加载对象的情况下读取/访问对象的属性。换句话说,我可以避免上面代码中的load()
and吗?rm()
非常感谢您的建议!
更新:附加问题:我的代码有什么问题,因为即使它不应该执行处理 - 以防所有信息都是最新的(缓存和配置文件也没有更改)?
更新 2(每个@MrFlick 的答案的附加代码):
# construct name from data source prefix and data ID (see config. file),
# so that corresponding data object (usually, data frame) will be saved
# later under that name via save()
dataName <- paste(dsPrefix, "data", indicator, sep = ".")
assign(dataName, srdaGetData())
data <- as.name(dataName)
# save hash of the request's SQL query as data object's attribute,
# so that we can detect when configuration contains modified query
attr(data, "SQL") <- base64(request)
# save current data frame to RData file
save(list = dataName, file = rdataFile)
# alternatively, use do.call() as in "getFLOSSmoleDataXML.R"
# clean up
rm(data)