我可以访问R数据对象吗?没有从文件中完全加载对象的属性?

时间:2014-05-16 17:25:14

标签: r attributes persistence data-objects rdata

这是情况。我的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()吗?

非常感谢您的建议!

更新:附加问题:我的代码有什么问题,因为即使它不应该执行处理 - 如果所有信息都是最新的(缓存和配置文件中也没有变化)?

更新2(@FrFlick的答案附加代码):

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

2 个答案:

答案 0 :(得分:2)

您无法“真正”执行此操作,但您可以修改我的cgwtools::lsdata函数中的代码。

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

这会加载,从而花费时间和短暂记忆,然后本地环境消失。因此,为要检查属性的项添加参数,在函数内添加一行attributes(your_items) ->y ; return (list(x=x,y=y))

答案 1 :(得分:1)

使用load()的方式存在问题。当您使用save / load时,您可以&#34;冻干&#34;多个对象到.RData文件。他们&#34;重新渗透&#34;进入当前的环境。因此,当您调用load()时,它不会返回对象,它会返回一个字符向量,其中包含已还原的所有对象的名称。由于您没有提供save()代码,因此我不确定您的加载文件中实际存在哪些内容,但如果它是名为data的变量,则只需调用

load(rdataFile)

不是

data <- load(rdataFile)