16

このような行を持つ複数のブロックを含むスクリプトがあります...

#Read data for X
DataX = read.delim(file = 'XRecords.txt',
                   col.names = XFields[,'FieldName'])
print('Data X read')
#Convert fields that should be numeric into numeric so they can summed
DataX[,NumFieldNames] = as.numeric(as.character(XData[,NumFieldNames]))
print('Data X scrubbed')

スクリプトをソースすると、次のような出力が得られます...

[1] "Data X read"
[1] "Data X scrubbed"
[1] "Data Y read"
[1] "Data Y scrubbed"
Warning message:
In eval(expr, envir, enclos) : NAs introduced by coercion

その出力に基づいて、データYをリロードし、文字列から数値への変換が失敗したレコードを探し始めました。数時間の欲求不満の後、私はデータXが実際に型変換エラーを持っていたものであることに気づきました。

警告が発生したように見えますが、スクリプトが終了するまでコンソールに表示されません。警告が発生したらすぐにコンソールに出力する方法はありますか?flush.console()を試しましたが、警告に対しては機能しないようです。

回避できる場合は、システムに追加のパッケージをロードしないようにします。私はこれを仕事に使用しており、CRANディストリビューションをコンピューターにインストールするためだけに、いくつかのフープを飛び越えなければなりませんでした。

ありがとうございました。私は助けに感謝します。

4

2 に答える 2

20

問題を示す例を作ってみましょう

foo <- function() {
  X <- c("1", "2", "three")
  print("Data X read")
  X <- as.numeric(X)
  print("Data X scrubbed")
  Y <- c("1", "2", "3")
  print("Data Y read")
  Y <- as.numeric(Y)
  print("Data Y scrubbed")
}

(インタラクティブでも)実行すると、表示される動作が表示されます

> foo()
[1] "Data X read"
[1] "Data X scrubbed"
[1] "Data Y read"
[1] "Data Y scrubbed"
Warning message:
In foo() : NAs introduced by coercion

警告の動作は、warnオプションで処理されます(を参照help("options"))。それは以下を含む選択肢を与えます

が1の場合warn、警告は発生時に出力されます。

オプションを1に変更すると、次のようになります。

> options(warn=1)
> foo()
[1] "Data X read"
Warning in foo() : NAs introduced by coercion
[1] "Data X scrubbed"
[1] "Data Y read"
[1] "Data Y scrubbed"
于 2013-03-15T18:45:35.547 に答える
-1

問題は、Rの警告がstdoutではなくstderrに出力されることです。stderrとoutの両方をフラッシュすると、問題が解決するはずです。

flush(stderr())
于 2013-03-15T18:23:26.470 に答える