2013-04-22 168 views
9

我不是想解決任何特定問題,而是試圖學習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 

會明白在哪裏我的邏輯在這種情況下出現問題的任何提示,有什麼其他的好除了!= case外,該運算符的用法。

謝謝! 謝爾蓋

回答

13

首先,它可能是最好不去想!=!作用於=,而是作爲一個獨立的二進制運算符乾脆。

一般而言,!只應用於布爾向量。所以這可能是更喜歡你所追求的:

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

其中names(l) %in% x返回沿,表明它們是否包含在x或不在名單l的名稱的布爾向量。最後,我避免使用list作爲變量,因爲您可以看到它也是一個相當常見的功能。

+0

喬蘭,非常感謝澄清和解釋,現在對我來說都是有意義的。 – 2013-04-22 23:06:10

8

首先,我認爲!!=不是!運算符。這是一個明顯的,!=運營商,這意味着「不同於」。

其次,!操作者是邏輯一,邏輯否定,並且它必須被施加到邏輯矢量:

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

如號碼可被強制轉換爲邏輯,它也可以被應用到數值矢量。在這種情況下0將被視爲FALSE和任何其他價值TRUE

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

在您的例子,你想這個邏輯運算符適用於字符串,這引起了一個錯誤。

如果您想要通過名稱,索引或條件對列表,數據框或向量進行子集化,您應該閱讀並瞭解R語言的索引部分,R語言的索引部分將在R手冊和大多數入門書籍和文檔。以子組名稱的列表

的一種方法是,例如:

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

我同意的一切由其他兩個海報說,但要加上一句話,就是教R.時,我總是告訴

R的作用在於它從內部到外部評估語句,並且每個語句都需要獨立運行。如果你在內部陳述中已經有了一個錯誤,難怪外人不會產生任何東西。

在你的情況下,人們可以說你有兩條語句:!xlist的列表通過[訪問。

如果你複製的r行爲您發現!x已經產生錯誤:

> !x 
Error in !x : invalid argument type 

因此,正確的解決方案,試圖改變這一步。

因此:當發生錯誤並且向外工作時,請務必檢查最內層的語句。