Code Fix

中級

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")
Error in FUN(X[[i]], ...) : argument "power" is missing, with no default

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")
Error in FUN(X[[i]], ...) : argument "factor" is missing, with no default

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")
Error in FUN(X[[i]], ...) : argument "rate" is missing, with no default

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")
Error in FUN(X[[i]], ...) : argument "width" is missing, with no default

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")
Error in FUN(X[[i]], ...) : argument "ratio" is missing, with no default

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, パラメータ名 = 値)のように名前を明示する必要があります。

演習をはじめる

関連するエラー

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