c() のベクトルリテラルでカンマを付け忘れたときの構文エラー
c()で要素を並べる際、区切りのカンマを付け忘れると、次の要素が予期しないトークンとして構文エラーになります。
エラーメッセージの読み方
Error: unexpected numeric constant in "nums <- c(1, 2 3"
Error- エラー種別 — 実行前の構文解析で検出されました。行番号は付かず、代わりにどこまで読めたかのソース抜粋が示されます
unexpected numeric constant in "nums <- c(1, 2 3"- 内容 — 予期しなかったトークン、またはファイルの終わりに達したこと
このエラーが出る典型パターン
パターン1
1 nums <- c(1, 2 3) ^ 2 print(sum(nums))
Error: unexpected numeric constant in "nums <- c(1, 2 3"
c()の要素はカンマで区切ります。スペースだけでは区切りとして認識されず、次の数値が予期しないトークンとして構文エラーになります。
直し方: (空) を , にします。
広告
広告スロット(未設定)
パターン2
1 prices <- c(100, 200 300) ^ 2 print(sum(prices))
Error: unexpected numeric constant in "prices <- c(100, 200 300"
数値を並べるだけのベクトルでも、区切りのカンマは省略できません。
直し方: (空) を , にします。
パターン3
1 temps <- c(36.5, 37.2 38.0) ^ 2 print(max(temps))
Error: unexpected numeric constant in "temps <- c(36.5, 37.2 38.0"
小数の要素でも同様にカンマが必要です。要素の型が変わってもルールは変わりません。
直し方: (空) を , にします。
パターン4
1 scores <- c(10, 20 30, 40) ^ 2 print(max(scores))
Error: unexpected numeric constant in "scores <- c(10, 20 30"
複数箇所カンマがあるベクトルでも、抜けている1箇所だけで構文エラーになります。
直し方: (空) を , にします。
パターン5
1 flags <- c(TRUE, FALSE TRUE) ^ 2 print(sum(flags))
Error: unexpected numeric constant in "flags <- c(TRUE, FALSE TRUE"
TRUE/FALSEのような論理値のベクトルでもカンマ区切りは必須です。
直し方: (空) を , にします。
よくある誤解
スペースで区切って書いても、Rはそれを要素の区切りとして認識しません。区切りには必ずカンマが必要です。
実務での勘所
PythonやRubyには単語だけを空白区切りで並べれば配列になる専用の記法がありますが、Rにはそうした省略記法はなく、c()に律儀にカンマ区切りで書く必要があります。近い目的を達成したい場合は、strsplit("apple banana cherry", " ")[[1]]のように、空白区切りの1つの文字列を分割する方法もありますが、こちらは文字列操作を経由する遠回りな方法です。