【发布时间】:2014-05-19 13:41:07
【问题描述】:
这是我相关问题的延续:Error when trying to interactively load data file saved by paused batch script。我决定用一个可重现的例子单独提出我的问题,以避免使上一个问题中已经很大的描述变得更大。在以下可重现的示例中,我希望检索存储对象(“重要数据”)的 值,但正如您所见,我检索的是 对象本身的名称(“sf.data.devLinks”)。我怀疑这可能是因为我使用了as.name,但我在交互式会话中另外测试了一个原始示例,as.name 工作正常。如您所见,我也尝试过使用eval 和substitute,但没有帮助。
library(RCurl)
info <- "Important data"
ATTR <- "SQL"
request <- "SELECT info FROM topSecret"
dataName <- "sf.data.devLinks"
rdataFile <- "/tmp/testAttr.rds"
save <- TRUE
getData <- function() {
return (info)
}
requestDigest <- base64(request)
# check if the archive file has already been processed
message("\nProcessing request \"", request, "\" ...\n")
# read back the object with the attribute
if (file.exists(rdataFile)) {
# now check if request's SQL query hasn't been modified
data <- readRDS(rdataFile)
message("Retrieved object '", data, "', containing:\n")
message(str(data))
requestAttrib <- attr(data, ATTR, exact = TRUE)
if (is.null(requestAttrib)) {
message("Object '", data, "' doesn't have attribute \"",
ATTR, "\"\n")
}
else {
message("Object '", data, "' contains attribute ", ATTR, ":\n\"",
base64(requestAttrib), "\"\n")
if (identical(requestDigest, requestAttrib)) {
message("Processing skipped: RDS file is up-to-date.\n")
save <- FALSE
return
}
}
rm(data)
}
if (save) {
message("Saving results of request \"",
request, "\" as R data object ...\n")
assign(dataName, getData())
data <- as.name(dataName)
#eval(substitute(assign(dataName, getData()),
# list(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, ATTR) <- base64(request)
# save current data frame to RDS file
saveRDS(data, rdataFile)
}
请注意,测试此代码需要运行两次(第一次运行 - 存储对象,第二次 - 检索)。
【问题讨论】:
-
等一下。最后,您希望名为 what 的对象包含 what data?这还不完全清楚。
-
@SimonO'Hanlon:我希望名为
sf.data.devLinks的对象具有Important data的值和SQL的属性,包含base64 编码的request。属性部分符合预期,但值部分不是。
标签: r variables object persistence metaprogramming