Code Fix

初級

argument is missing, with no default の原因と直し方

関数が必要とする引数を渡し忘れると、デフォルト値が定義されていない限りこのエラーになります。

エラーメッセージの読み方

Error in f(1) : argument "b" is missing, with no default
Error
エラー種別 — 実行中に発生しました
f(1)
発生箇所 — エラーの原因になった呼び出し
argument "b" is missing, with no default
詳細メッセージ — 何が問題だったか

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

パターン1

 1  f <- function(a, b) {
 2    a + b
 3  }
 4  print(f(1   ))
              ^
Error in f(1) : argument "b" is missing, with no default

fは引数を2つ必要としますが、1つしか渡していません。デフォルト値の無い引数は省略できません。

直し方: (空) を , 6 にします。

この問題を解いてみる →

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

パターン2

 1  greet <- function(name, greeting) {
 2    paste(greeting, name)
 3  }
 4  print(greet("Taro"         ))
                          ^
Error in greet("Taro") : argument "greeting" is missing, with no default

2番目の引数を渡し忘れると、その場でエラーになります。NULLやNAで自動的に補われることはありません。

直し方: (空) を , "Hello" にします。

この問題を解いてみる →

パターン3

 1  area <- function(width, height) {
 2    width * height
 3  }
 4  print(area(5   ))
                 ^
Error in area(5) : argument "height" is missing, with no default

引数の数が定義と一致しないと、関数の中身が実行される前にエラーになります。

直し方: (空) を , 4 にします。

この問題を解いてみる →

パターン4

 1  full_name <- function(first, last) {
 2    paste(first, last)
 3  }
 4  print(full_name("Taro"          ))
                               ^
Error in full_name("Taro") : argument "last" is missing, with no default

呼び出し時に渡す引数の数は、関数定義の引数の数と正確に一致させる必要があります。

直し方: (空) を , "Yamada" にします。

この問題を解いてみる →

パターン5

 1  subtract <- function(a, b) {
 2    a - b
 3  }
 4  print(subtract(10   ))
                      ^
Error in subtract(10) : argument "b" is missing, with no default

デフォルト値が定義されていない引数は、呼び出し時に必ず値を渡す必要があります。

直し方: (空) を , 4 にします。

この問題を解いてみる →

よくある誤解

「渡さなかった引数は自動的にNULLやNAで補われるはず」という思い込みは誤りです。デフォルト値の無い引数を省略すると、その場でエラーになります。

実務での勘所

このエラーが発生するタイミングは、関数を呼び出した瞬間ではありません。Rの引数は遅延評価(実際にその引数を使う行に到達するまで評価されない)という仕組みを持っているため、f(1)のように必須引数を渡し忘れても、関数の呼び出し自体はいったん成功します。関数の中でその渡されなかった引数を実際に使おうとした行に到達して初めて、'argument is missing'エラーが発生します。エラーメッセージが出た場所と、本当の原因(呼び出し時の渡し忘れ)の行が離れていることがあるのは、この遅延評価のためです。

演習をはじめる

関連するエラー

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