R:引数に vector を渡しても、型を確認すると vector じゃなかった件

自分では思ってもいなかった挙動だったので、ちょっとした衝撃でした。
やっていたことは、

  • 引数に文字列の vector を受け取る関数を作成した。
  • その後、同様の処理内容で引数に文字列を受け取る関数が欲しかった。
    なので、以下を調べ始めた。
    • 引数の型を判定して分岐するか?
    • ジェネリック関数にするべきなのか?

結果としては、そのまま使えるんかい、と。
該当のコードを簡略化すると、以下の様なものでした。

test <- function (names) {
  print(typeof(names))
  sapply(seq(names), function (i) {
    paste0(i, "=", names[i])
  })
}
test(c("hoge", "foo", "bar"))

Google Colab で実行した結果は以下の通り。
names の型は character と言われますね。

[1] "character"
'1=hoge''2=foo''3=bar'

次は文字列を渡してみます。

test("piyo")

結果は、

[1] "character"
'1=piyo'

と、期待通りです。
疑問に思った部分を実行してみました。

seq("piyo")
"piyo"[1]
1
'piyo'

大丈夫なんですね。
今まで自分が経験してきた言語とは別物で中々興味深い。

コメント