1. ホーム
  2. r

[解決済み] リスト要素が存在するかどうかをテストするには?

2022-07-15 15:56:22

質問

問題点

リストの要素が存在するかどうかをテストしたいのですが、以下のような例があります。

foo <- list(a=1)
exists('foo') 
TRUE   #foo does exist
exists('foo$a') 
FALSE  #suggests that foo$a does not exist
foo$a
[1] 1  #but it does exist

この例では、私が知っているのは foo$a が存在することは知っていますが、このテストでは FALSE .

で調べたところ ?exists を見てみると with(foo, exists('a')TRUE を返しますが、なぜ exists('foo$a') が返す FALSE .

質問

  • なぜ exists('foo$a') を返すのか? FALSE ?
  • の使用は with(...) を使用することが望ましいですか?

どのように解決するのですか?

これは、実は思っているよりも少し厄介なことです。リストは実際には (多少の努力で) NULL 要素を含むことができるため、リスト内の NULL 要素をチェックするには is.null(foo$a) . より厳密なテストは、名前が実際にリストで定義されているかどうかをチェックすることかもしれません。

foo <- list(a=42, b=NULL)
foo

is.null(foo[["a"]]) # FALSE
is.null(foo[["b"]]) # TRUE, but the element "exists"...
is.null(foo[["c"]]) # TRUE

"a" %in% names(foo) # TRUE
"b" %in% names(foo) # TRUE
"c" %in% names(foo) # FALSE

...そして foo[["a"]] よりも安全です。 foo$a よりも安全です。後者は部分マッチを使うので、より長い名前にもマッチするかもしれないからです。

x <- list(abc=4)
x$a  # 4, since it partially matches abc
x[["a"]] # NULL, no match

[UPDATE] では、質問に戻りますが、なぜ exists('foo$a') が機能しないのかという疑問に戻ります。その exists 関数は変数が環境に存在するかどうかをチェックするだけで、 オブジェクトの一部が存在するかどうかをチェックするわけではありません。文字列 "foo$a" は文学的に解釈されます。foo$a" という変数があるか? ...そして答えは FALSE ...

foo <- list(a=42, b=NULL) # variable "foo" with element "a"
"bar$a" <- 42   # A variable actually called "bar$a"...
ls() # will include "foo" and "bar$a" 
exists("foo$a") # FALSE 
exists("bar$a") # TRUE