2013-04-22 11 views
9

私は特定の問題を解決しようとしていないが、Rを学び、その論理否定演算子を理解しようとしている!ページhttp://stat.ethz.ch/R-manual/R-devel/library/base/html/Logic.htmlどのように論理否定演算子 "!"作品を

に文書化=と組み合わせて使用​​する場合には、次のような表現で、私の作品:

1 != 2 
TRUE 

しかし、私は非常にこの演算子のスタンドアロンアプリケーションを理解することはできません。たとえば、特定の名前を持たないリストの要素を選択するために使用できますか?ここではそれをする私の試みだが、それはうまくいきませんでした:

Error in !x : invalid argument type 

は私のロジックが、この場合に問題が発生した場所の任意のヒントを理解するだろう、と他の良いものです:

vector1 <- 1:5 # just making vector of 5 numbers 
vector2 <- 5:1 # same vector backwards 
list <- list(Forward=vector1, Backwards=vector2) # producing list with two elements 
x = "Forward" 
list[!x] 

私の出力があります!= case以外のこの演算子の使用。

ありがとうございます! セルゲイ

答えて

13

まず、それはではなく、別の二項演算子のように完全に、=に作用する!として!=を考えるのではないでしょう最善です。

一般に、!は論理値ベクトルにのみ適用する必要があります。 names(l) %in% xは、それらがxかに含まれているかどうかを示すリストlの名前に沿ってブールベクトルを返す

vector1 <- 1:5 # just making vector of 5 numbers 
vector2 <- 5:1 # same vector backwards 
l <- list(Forward=vector1, Backwards=vector2) # producing list with two elements 
x = "Forward" 
l[!(names(l) %in% x)] 

:これは、より多くのあなたが後にしているもののように思われます。最後に、私は変数としてlistの使用を避けました。これはかなり一般的な関数でもあることがわかります。

+0

ジョラン、説明と説明のために多くの感謝、私はすべて今私に意味がある。 –

8

まず、!!=は、!の演算子ではないと思います。これは別個の!=演算子で、「異なる」を意味します。

次に、!オペレータは論理1、論理否定であり、それは論理ベクトルに適用されなければならない:

R> !(c(TRUE,FALSE)) 
[1] FALSE TRUE 

番号が論理に強制することができるように、それにも適用することができます数値ベクトル。 0TRUEとしてFALSEと他の値とみなされます。この場合:あなたの例では

R> !c(1,0,-2.5) 
[1] FALSE TRUE FALSE 

、あなたはエラーを発生させ、文字列、この論理演算子を適用しようとしています。

リスト、データフレーム、またはベクトルを名前、インデックス、または条件でサブセット化する場合は、R言語の索引付け部分を読んで理解する必要があります。これは、Rマニュアルおよびほとんどの入門書およびドキュメント。名前でリストをサブセットに

一つの方法は、可能性があり、例えば:

R> list[!(names(list) %in% "Forward")] 
$Backwards 
[1] 5 4 3 2 1 
9

私は、他の2枚のポスターで言ったすべてに同意するが、R.を教えるとき、私はいつも言うもう一つのことを追加したいです

Rは、内部から外部へのステートメントを評価し、それぞれのステートメントを独自のもので実行する必要があるという点で機能します。内側のステートメントにすでにエラーがある場合は、外側には何も生成されません。

あなたのケースでは、!xという2つのステートメントがあり、listから[にアクセスするリストがあると言うことができます。

あなたがRの挙動を再現した場合、あなたは!xが既にエラーが発生していることに気づく:

したがって
> !x 
Error in !x : invalid argument type 

、正しい解決策は、この手順を変更してみてください。

So:エラーが発生したときに、あなたの最も内側のステートメントを常にチェックして、自分自身を外側に向けてください。