このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

インデックス/キーの範囲外、NULLの解釈が酷いの一言

準備。


> vec <- c(1, 2, 3)
> lis <- list(a=1, b=2, c=3)
> env <- new.env()
> env$a <- 1; env$b <- 2; env$c <- 3

試す。


> vec[4]
[1] NA
> vec[[4]]
以下にエラー vec[[4]] : 添え字が許される範囲外です
> lis[4]
$
NULL
> lis["d"]
$
NULL
> lis[[4]]
以下にエラー lis[[4]] : 添え字が許される範囲外です
> lis$d
NULL
> lis[["d"]]
NULL
> env$d
NULL
> get("d", env)
以下にエラー get("d", env) : オブジェクト 'd' がありません

なんちゅーバラバラさや。酷い!

ベクトル リスト 環境
[n] NA NULL -
[[n]] 範囲外エラー 範囲外エラー -
["s"] NA NULL -
[["s"]] 範囲外エラー NULL -
$s - NULL NULL
get - - 非存在エラー

さらに酷いのは:

  1. vec[3] <- NA と vec[[3]] <- NA は単なる代入
  2. lis[[3]] <- NULL は要素の消去
  3. lis[3] <- NULL も要素の消去
  4. env$d <- NULL は単なる代入

ほんとにどうかしている。listへのNULLの代入は、lis[1] <- list(NULL) のようにする、ってバカか。

NULLはベクトル成分には入れられないし、かといって長さ0ベクトルとNULLは違う。だが、c()はNULLを返す。length(NULL)も正常に0を返す。ほんとにどうかしている。

== に関しては、


> 1 == 1
[1] TRUE
> NA == 1
[1] NA
> NA == NA
[1] NA
> 1 == NULL
logical(0)
> NA == NULL
logical(0)
> NULL == NULL
logical(0)
> numeric(0) == NULL
logical(0)
> numeric(0) == numeric(0)
logical(0)
>

インデキシングに関するNULLの挙動


> NULL[1]
NULL
> NULL[0]
NULL
> NULL[0]
NULL
> NULL[2]
NULL
> NULL[1]
NULL
> NULL[2]
NULL
> NULL[0]
NULL
> NULL[[1]]
NULL
> NULL$a
NULL
>

ほんとにどうかしている。

list() が作れるので、list() がNULLかと考えたが、挙動も違うし、identical(list(),NULL)でもFALSE。