1

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

2 に答える 2

2

「本当に」それを行うことはできませんが、私のcgwtools::lsdata関数のコードを変更することはできます。

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

これがロードされるため、時間がかかり、一時的にメモリが消費され、ローカル環境が消えます。したがって、属性を確認したいアイテムの引数を追加し、関数内に行を追加しますattributes(your_items) ->y ; return (list(x=x,y=y))

于 2014-05-16T18:03:00.610 に答える
1

そして、あなたの使い方にも問題がありますload()save/を使用するloadと、複数のオブジェクトを .RData ファイルに「フリーズドライ」できます。それらは、現在の環境に「再浸透」します。その結果、 を呼び出すとload()、オブジェクトは返されず、復元されたすべてのオブジェクトの名前を含む文字ベクトルが返されます。コードを提供していないため、ロード ファイルに実際に何が入っているかはわかりませんが、それsave()が という変数だった場合は、data

load(rdataFile)

いいえ

data <- load(rdataFile)
于 2014-05-16T18:44:06.283 に答える