11

私は特定の問題を解決しようとしているわけではありませんが、R を学び、その論理否定演算子 "!" を理解しようとしています。ページhttp://stat.ethz.ch/R-manual/R-devel/library/base/html/Logic.htmlに記載

次のような式で = と組み合わせて使用​​すると、私にとってはうまくいきます。

1 != 2
TRUE

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

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]

私の出力は次のとおりです。

Error in !x : invalid argument type

この場合、私のロジックがどこでうまくいかないか、および != ケースを除いてこの演算子の他の良い使い方についてのヒントをいただければ幸いです。

ありがとう!セルゲイ

4

3 に答える 3

15

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

一般に、!ブール値ベクトルにのみ適用する必要があります。したがって、これはおそらくあなたが求めているものに似ています:

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)]

wherenames(l) %in% xは、リストの名前に沿ってブール値ベクトルを返し、リストlに含まれているかどうかを示しxます。最後に、変数としての使用を避けましたlist。これもかなり一般的な関数であることがわかるからです。

于 2013-04-22T22:02:23.973 に答える
11

他の 2 人の投稿者が言っていることすべてに同意しますが、R を教えるときにいつも言っていることをもう 1 つ追加したいと思います。

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

あなたの場合、次の 2 つのステートメントがあると!x言えlistます[

R の動作を再現すると、!x既にエラーが発生していることがわかります。

> !x
Error in !x : invalid argument type

したがって、正しいソリューションはこのステップを変更しようとします。

ですから:エラーが発生したときは、常に最も内側のステートメントを確認し、外側に向けて作業してください。

于 2013-04-22T22:25:27.990 に答える
8

!まず、インは演算子で!=はないと思います!!=これは、 「~とは異なる」を意味する、distinct演算子です。

次に、!演算子は論理 1、論理否定であり、論理ベクトルに適用する必要があります。

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

数値は論理値に強制できるため、数値ベクトルにも適用できます。この場合、 は と見なされ 、その他の値0は と見なされます。FALSETRUE

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

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

リスト、データ フレーム、またはベクトルを名前、インデックス、または条件でサブセット化する場合は、R 言語のインデックス作成部分を読んで学習する必要があります。これについては、R のマニュアルやほとんどの入門書やドキュメントで説明されています。

リストを名前でサブセット化する 1 つの方法は、たとえば次のようになります。

R> list[!(names(list) %in% "Forward")]
$Backwards
[1] 5 4 3 2 1
于 2013-04-22T22:06:14.837 に答える