Rのエラー、警告、メッセージ
3種類のシグナルと、それぞれが発生するタイミングを理解します。
「Rのエラー、警告、メッセージ」はCoddyKit上の無料R Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはR Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 R Academyコースには全4レッスンが含まれています。
Rのコンディションシステム
Rには、問題を伝えるための正式なコンディションシステムがあります。主なコンディションのクラスは、3つです。エラー(致命的で、実行を停止)、警告(致命的ではなく、コードの終了後に表示)、メッセージ(情報提供用で、stderrに出力)です。
# Each condition type behaves differently
message('This is a message')
warning('This is a warning')
# stop() would halt here, so wrap it
tryCatch(stop('This is an error'), error = function(e) print(e))stop() — エラーの生成
stop(msg)はエラーコンディションを通知します。実行は直ちに停止し、エラーメッセージが表示されます。入力が無効な場合や回復不能な状況を検出した場合に、関数内で処理を中断するために使います。
divide <- function(x, y) {
if (y == 0) stop('Division by zero is not allowed')
x / y
}
tryCatch(divide(10, 0), error = function(e) cat('Error:', conditionMessage(e), '\n'))
divide(10, 2)warning() — 致命的でない警告
warning(msg)は警告コンディションを通知します。エラーとは異なり、警告では実行は停止せず、関数は処理を続けて警告を収集します。デフォルトではすべてのコードの実行後に警告が表示されますが、options(warn=1)を設定すると直ちに表示されます。
safe_sqrt <- function(x) {
if (x < 0) {
warning('Negative input; returning NaN')
return(NaN)
}
sqrt(x)
}
result <- safe_sqrt(-4)
cat('Result:', result, '\n')message() — 情報提供用コンディション
message(msg)はメッセージコンディションを通知します。stderrに出力され、自動的に改行が追加され、suppressMessages()で抑制できます。エラーや警告ではなく、関数内の進捗更新に使います。
load_data <- function(n) {
message('Loading ', n, ' records...')
seq_len(n)
}
data <- suppressMessages(load_data(100))
cat('Got', length(data), 'records\n')simpleErrorとsimpleWarningオブジェクト
Rがコンディションを作成すると、メッセージをコンディションオブジェクトでラップします。simpleError('msg')とsimpleWarning('msg')を使うと、コンディションオブジェクトを手動で作成できます。conditionMessage()で内容を確認できます。
e <- simpleError('something went wrong')
w <- simpleWarning('this looks suspicious')
cat('Error class :', class(e), '\n')
cat('Warning class :', class(w), '\n')
cat('Error message :', conditionMessage(e), '\n')
cat('Warning msg :', conditionMessage(w), '\n')conditionMessage()とconditionCall()
conditionMessage(cond)は、任意のコンディションオブジェクトからテキストメッセージを取り出します。conditionCall(cond)は、そのコンディションを発生させた呼び出しを取り出します。どちらも、エラーハンドラー内でコンディションをログに記録したり再通知したりする際に便利です。
tryCatch(
log(-1),
warning = function(w) {
cat('Caught warning :', conditionMessage(w), '\n')
cat('From call :', deparse(conditionCall(w)), '\n')
}
)options(warn = 2) — 警告をエラーとして扱う
options(warn = 2)を設定すると、すべての警告がエラーに変換され、直ちに実行が停止します。開発中に警告を発生させるコードを早期に見つけるのに便利です。options(warn = 0)で元に戻せます。
old_warn <- options(warn = 0) # default: collect warnings
log(-1) # just a warning
options(warn = 0)
tryCatch({
options(warn = 2)
log(-1) # now fatal
}, error = function(e) cat('Caught as error:', conditionMessage(e), '\n'),
finally = options(old_warn))即時警告と遅延警告
options(warn = 0)(デフォルト)では、警告は収集され、最後に表示されます。options(warn = 1)では、各警告が発生した時点ですぐに表示されます。warn = 2では、警告がエラーになります。
# warn=1: print warnings immediately as they happen
old <- options(warn = 1)
result1 <- log(-1)
result2 <- sqrt(-4)
cat('Results:', result1, result2, '\n')
options(old)エラーと警告:致命的かどうか
重要な違いは、エラーはハンドラーで捕捉されない限り実行全体を停止するのに対し、警告は記録されるだけで実行が続くことです。そのため、エラーを使うべき場面で警告を使うと、無効な入力によって誤った結果が気付かないまま生成される可能性があります。
# With warning: execution continues
f_warn <- function(x) { if (x < 0) warning('negative'); x^2 }
cat('warn result:', f_warn(-3), '\n') # still computes 9
# With error: execution stops
f_stop <- function(x) { if (x < 0) stop('negative'); x^2 }
tryCatch(f_stop(-3), error = function(e) cat('stopped:', e$message, '\n'))コンディションのネスト
コンディションは、別のコンディションハンドラー内で発生させることができます。警告ハンドラーからstop()を呼び出して、警告をエラーに格上げすることもできます。これは、サードパーティ製コードをより厳格に扱うためによく使われるパターンです。
strict_log <- function(x) {
withCallingHandlers(
log(x),
warning = function(w) {
stop(paste('Strict mode: warning treated as error:', conditionMessage(w)))
}
)
}
tryCatch(strict_log(-1), error = function(e) cat('Error:', e$message, '\n'))
cat('log(4) =', strict_log(4), '\n')suppressWarnings()とsuppressMessages()
suppressWarnings(expr)は式を評価しながら、すべての警告を黙って捕捉して破棄します。suppressMessages(expr)はメッセージコンディションに対して同じ処理を行います。警告を抑制すると実際の問題が隠れる可能性があるため、使用は控えめにしてください。
# Without suppression: warning shown
result1 <- log(-1)
# With suppression: warning hidden
result2 <- suppressWarnings(log(-1))
cat('Both are NaN:', is.nan(result1), is.nan(result2), '\n')確認問題
warning()とstop()について、正しい説明は次のうちどれですか。
コンディション:要点
Rのコンディションに関する要点:
stop()= エラー = 致命的で直ちに停止、warning()= 致命的ではなく実行継続、message()= 情報提供用でstderrに出力- 3つはいずれもクラス階層を持つコンディションオブジェクトを作成します
conditionMessage(e)は任意のコンディションからテキストを取り出しますoptions(warn=1)は警告を直ちに表示し、warn=2は警告をエラーとして扱いますsuppressWarnings()/suppressMessages()はコンディションを非表示にします- 続行すると問題がある無効な入力には、
stop()を優先して使います
# Summary of the three condition functions
tryCatch({
message('Step 1 starting')
warning('something looks odd')
stop('cannot continue')
}, message = function(m) cat('MSG:', conditionMessage(m)),
warning = function(w) cat('WARN:', conditionMessage(w), '\n'),
error = function(e) cat('ERR:', conditionMessage(e), '\n'))よくある質問
「Rのエラー、警告、メッセージ」レッスンは無料ですか?
はい。「Rのエラー、警告、メッセージ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。
「Rのエラー、警告、メッセージ」で何を学びますか?
3種類のシグナルと、それぞれが発生するタイミングを理解します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
R Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「Rのエラー、警告、メッセージ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このR Academyレッスンでコードを書いて実行できますか?
はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。