リスト要素が存在するかどうかをテストするにはどうすればいいですか? 質問する

リスト要素が存在するかどうかをテストするにはどうすればいいですか? 質問する

問題

リストの要素が存在するかどうかをテストしたいのですが、ここに例があります

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')TRUEexists('foo$a')FALSE

質問

  • なぜexists('foo$a')戻るのですかFALSE?
  • with(...)推奨されるアプローチを使用していますか?

ベストアンサー1

これは実際にはあなたが考えるよりも少し難しいです。リストには実際に(多少の努力で)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

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

おすすめ記事