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") ^
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") ^
「文字列の引数ならどんな値でも受け取ってくれるはず」という思い込みは誤りで、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") ^
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") ^
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") ^
match.arg()は候補の中から一致する値を探すだけの仕組みなので、候補にない色名を渡すと実行時エラーになります。
直し方: "purple" を "red" にします。
よくある誤解
「文字列を渡す引数なら、どんな値を渡しても受け取ってくれるはず」という思い込みは誤りです。match.arg()は関数定義のデフォルト値に書かれた候補の中からしか値を受け付けず、候補外の値は実行時エラーとして拒否されます。
実務での勘所
match.arg()には、このエラーを出す役割以外にもう1つの働きがあります。引数を完全に省略して呼び出すと、候補として並べた選択肢のうち最初のものを既定値として自動的に選んでくれます。type = c("linear", "quadratic", "cubic")と定義した関数をtypeを指定せずに呼べば、match.arg()は自動的に"linear"を選びます。「候補外の値を拒否する検証」と「省略時に最初の候補を既定値にする」という2つの役割を1行で済ませられることが、広く推奨されている理由です。