1

600,000 行の data.table があり、次のコマンドを実行します。

ranges <- mapply(function(mi, ma) {seq(from=mi, to=ma, by="days")}, mi=Moves$Start, ma=Moves$End)

しばらくすると、次のエラー メッセージが表示されます。

Error in seq.int(0, to0 - from, by) : wrong sign in 'by' argument

より小さなデータセットでコードをテストしましたが、問題なく動作しているようです。これにより、エラー メッセージはデータセット内の値の結果であると考えられます。data.table の問題行をトレースする効率的な方法を推奨できる人はいますか? 言うまでもなく、手動で 60 万行をチェックするのは少し多すぎます。

data.table で問題のある行を見つけるための提案をお待ちしております。

4

2 に答える 2

3

明らかな解決策は、無名関数を完全に名前が付けられた最初のクラスの関数に変換することです。その後、関数をデバッグできます。または、回復オプションをオンにすると、現在のスタックの評価フレームにステップインして、エラーが発生した時点での変数の状態を確認できます。

myFun <- function(mi, ma) {
  seq(from=mi, to=ma, by="days")
}

経由でデバッグできる名前付き関数を取得します

debug(myFun)

また

debugonce(myFun)

エラー回復を有効にするには

op <- options(error = recover)

(次のコマンドでそれを休ませることができます:options(op)またはoptions(error = stop)

miこの場合、次の値よりも大きいと思われますma:

> myFun(Sys.Date(), Sys.Date()-1)
Error in seq.int(0, to0 - from, by) : wrong sign in 'by' argument

その場合は、次のように変更myFunして確認できます。

myFun <- function(mi, ma) {
  if(mi > ma)
    stop("`mi` is > than `ma`")
  seq(from=mi, to=ma, by="days")
}

そうすれば、より有益なエラー メッセージが表示されます。

それが失敗した場合はoptions(error = recover)、関数に対応する評価呼び出しにドロップして、 と の値を確認しmiますma

于 2013-03-21T18:42:46.877 に答える