インデックス/キーの範囲外、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 | - | - | 非存在エラー |
さらに酷いのは:
- vec[3] <- NA と vec[[3]] <- NA は単なる代入
- lis[[3]] <- NULL は要素の消去
- lis[3] <- NULL も要素の消去
- 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。