これが状況です。私の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)