21

次のようなリストがあるとします

foo=list(bar="hello world")

リストに特定のキーがあるかどうかを確認したいと思います。と等しくないものに対してfoo$bar2が返さNULLれることを観察したので、戻り値が null かどうかを確認できると考えましたが、これはうまくいかないようです:bar2bar

if (foo$bar2==NULL) 1 # do something here

ただし、これによりエラーが発生します。

Error in if (foo$bar2 == NULL) 1 : argument is of length zero

次に、C のように、NULL が false と同等かどうかを試しました。

if (foo$bar2) 1 # do something here

これにより、同じエラーが発生します。

今、2 つの質問があります。リストにキーが含まれているかどうかを確認するにはどうすればよいですか? また、式が null かどうかを確認するにはどうすればよいですか?

4

1 に答える 1

40

「キー」の概念は、R では「名前」と呼ばれます。

if ("bar" %in% names(foo) ) {  print("it's there") }  # ....

これらは、名前が付けられ、次の関数.Namesで抽出される特別な属性に格納されます。names

dput(foo)
#structure(list(bar = "hello world"), .Names = "bar")

R には「名前」という言葉の 2 つの異なる用法による混乱の一般的な原因があるため、ここで意味論的な注意を払い.Namesますname$またはのような検査または抽出関数とは無関係の値を持つ文字列またはトークンを使用します[。文字またはピリオドで始まり、その他の特殊文字を含まないトークンは、有効なname. existsそのの引用されたバージョンが与えられた関数でそれをテストすることができますname:

 exists("foo")  # TRUE
 exists(foo$bar) #    [1] FALSE
 exists("foo$bar")#    [1] FALSE

したがって、nameR ではこの単語には 2 つの異なる意味があり、言語がどのように展開されているかを理解するには、このあいまいさに注意する必要があります。.Names意味は特別な目的を持つ属性を指し、-意味は「names言語オブジェクト」と呼ばれるものを指します。この単語symbolは、この単語の 2 番目の意味の同義語です。

is.name( quote(foo) ) #[1] TRUE

次に、無効性のテストに関する2番目の質問がこれにどのように流れ込むかを示すには:

if( !is.null(foo$bar) ) {  print("it's there") }  # any TRUE value will be a 1
于 2013-11-13T00:04:52.380 に答える