是否可以在不从文件完全加载对象的情况下访问 R 数据对象的属性?



情况是这样的。我的R代码应该检查应用程序的缓存中现有的RData文件是否最新。我通过保存由特定数据元素的base64编码名称组成的名称的文件来做到这一点。但是,通过提交每个元素的特定SQL查询来检索与这些元素对应的数据,所有这些都在数据集合的配置文件中指定。因此,当一个元素的数据被检索,但后来我不得不改变特定的SQL查询的情况下,数据没有被更新。

为了处理这种情况,我决定使用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()rm()吗?

非常感谢您的建议!

UPDATE:额外的问题:我的代码有什么问题,因为它执行处理,即使它不应该-在情况下,当所有的信息是最新的(缓存和配置文件没有变化)?

UPDATE 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)

你不能"真的"这样做,但你可以修改我的cgwtools::lsdata函数中的代码。

function (fnam = ".Rdata") 
{
    x <- load(fnam, envir = environment())
    return(x)
}

加载,因此占用时间并短暂占用内存,然后本地环境消失。因此,为想要检查属性的项目添加一个参数,在函数中添加一行attributes(your_items) ->y ; return (list(x=x,y=y))

您使用load()的方式存在问题。当你使用save/load时,你可以将多个对象"冻干"到一个。rdata文件中。他们"重新融入"当前的环境。因此,当您调用load()时,它不会返回对象,而是返回一个字符向量,其中包含它所恢复的所有对象的名称。因为你没有提供你的save()代码,我不确定什么是实际在你的加载文件,但如果它是一个名为data的变量,那么只需调用

load(rdataFile)

data <- load(rdataFile)

相关内容

  • 没有找到相关文章

最新更新