sapply に渡す関数へ追加引数を渡し忘れると missing エラーになる
sapply(x, f, ...)の...部分に追加引数を渡し忘れると、fの2つ目以降の必須引数が埋まらず、argument is missingエラーになります。
エラーメッセージの読み方
Error in FUN(X[[i]], ...) : argument "power" is missing, with no default
Error- エラー種別 — 実行中に発生しました
FUN(X[[i]], ...)- 発生箇所 — エラーの原因になった呼び出し
argument "power" is missing, with no default- 詳細メッセージ — 何が問題だったか
このエラーが出る典型パターン
パターン1
1 raise <- function(base, power) base ^ power 2 result <- sapply(c(2, 3, 4), raise ) ^ 3 cat(result, "\n")
raiseはpowerを必須引数として要求するので、sapplyの3個目以降の引数として明示的に渡す必要があります。
直し方: (空) を , power = 2 にします。
パターン2
1 scale_val <- function(x, factor) x * factor 2 result <- sapply(c(1, 2, 3), scale_val ) ^ 3 cat(result, "\n")
scale_valの2つ目の引数factorはxの要素だけでは埋まらないため、追加で渡す必要があります。
直し方: (空) を , factor = 10 にします。
パターン3
1 add_tax <- function(price, rate) price * (1 + rate) 2 result <- sapply(c(100, 200), add_tax ) ^ 3 cat(result, "\n")
add_taxのrateはデフォルト値が無いため、sapplyの呼び出しで渡し忘れるとmissingエラーになります。
直し方: (空) を , rate = 0.1 にします。
パターン4
1 pad_num <- function(x, width) x + width 2 result <- sapply(c(1, 2, 3), pad_num ) ^ 3 cat(result, "\n")
pad_numのwidthはxの要素からは埋まらないので、sapplyの追加引数として渡す必要があります。
直し方: (空) を , width = 5 にします。
パターン5
1 convert <- function(x, ratio) x * ratio 2 result <- sapply(c(10, 20, 30), convert ) ^ 3 cat(result, "\n")
convertのratioを渡し忘れると、sapplyが内部で呼ぶ各回の関数呼び出しでargument is missingエラーになります。
直し方: (空) を , ratio = 2 にします。
よくある誤解
「sapplyに渡した関数の引数は、xの要素だけで全部埋まるはず」という思い込みは誤りです。fが複数の引数を必要とする場合、xの要素で埋まるのは最初の引数だけで、残りはsapplyの3個目以降の引数として明示的に渡す必要があります。
実務での勘所
sapply(x, f, ...)の...部分に渡した追加引数は、既定では位置で対応付けられます。xの各要素はfの最初の引数に入るため、...で渡した1つ目の追加引数はfの2番目の引数に入ります。fの3番目以降の、間に省略可能な引数を挟んだ後ろのパラメータだけを指定したい場合は、位置に頼らずsapply(x, f, パラメータ名 = 値)のように名前を明示する必要があります。