Code Fix

上級

match.arg に候補外の値を渡すと 'arg' should be one of エラーになる

match.arg()で選択肢を制限した引数に、定義された候補のどれとも一致しない値を渡すと、'arg' should be one ofというエラーになります。

このエラーが出る典型パターン

パターン1

 1  process <- function(mode = c("fast", "slow", "auto")) {
 2    mode <- match.arg(mode)
 3    cat("mode:", mode, "\n")
 4  }
 5  process("turbo")
               ^
'arg' should be one of “fast”, “slow”, “auto”

match.arg()はデフォルト値に列挙された候補以外の文字列を渡すと、その場でエラーとして拒否します。

直し方: "turbo" を "fast" にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  render <- function(format = c("png", "jpg", "svg")) {
 2    format <- match.arg(format)
 3    cat("format:", format, "\n")
 4  }
 5  render("gif")
             ^
'arg' should be one of “png”, “jpg”, “svg”

「文字列の引数ならどんな値でも受け取ってくれるはず」という思い込みは誤りで、match.arg()は候補外の値を実行時エラーにします。

直し方: "gif" を "png" にします。

この問題を解いてみる →

パターン3

 1  set_level <- function(level = c("low", "mid", "high")) {
 2    level <- match.arg(level)
 3    cat("level:", level, "\n")
 4  }
 5  set_level("extreme")
                  ^
'arg' should be one of “low”, “mid”, “high”

match.arg()の候補はデフォルト値に書かれたベクトルそのものなので、候補にない値を渡すと実行時にエラーで止まります。

直し方: "extreme" を "low" にします。

この問題を解いてみる →

パターン4

 1  choose_plan <- function(plan = c("free", "basic", "pro")) {
 2    plan <- match.arg(plan)
 3    cat("plan:", plan, "\n")
 4  }
 5  choose_plan("premium")
                    ^
'arg' should be one of “free”, “basic”, “pro”

choose_planは候補として登録された3種類の文字列しか受け付けず、premiumのような候補外の値はエラーになります。

直し方: "premium" を "pro" にします。

この問題を解いてみる →

パターン5

 1  select_color <- function(color = c("red", "blue", "green")) {
 2    color <- match.arg(color)
 3    cat("color:", color, "\n")
 4  }
 5  select_color("purple")
                     ^
'arg' should be one of “red”, “blue”, “green”

match.arg()は候補の中から一致する値を探すだけの仕組みなので、候補にない色名を渡すと実行時エラーになります。

直し方: "purple" を "red" にします。

この問題を解いてみる →

よくある誤解

「文字列を渡す引数なら、どんな値を渡しても受け取ってくれるはず」という思い込みは誤りです。match.arg()は関数定義のデフォルト値に書かれた候補の中からしか値を受け付けず、候補外の値は実行時エラーとして拒否されます。

実務での勘所

match.arg()には、このエラーを出す役割以外にもう1つの働きがあります。引数を完全に省略して呼び出すと、候補として並べた選択肢のうち最初のものを既定値として自動的に選んでくれます。type = c("linear", "quadratic", "cubic")と定義した関数をtypeを指定せずに呼べば、match.arg()は自動的に"linear"を選びます。「候補外の値を拒否する検証」と「省略時に最初の候補を既定値にする」という2つの役割を1行で済ませられることが、広く推奨されている理由です。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)