2013-04-22 11 views
9

Nie próbuję rozwiązać żadnego konkretnego problemu, ale próbuję nauczyć się R i zrozumieć jego logiczny operator negacji "!" udokumentowane na stronie http://stat.ethz.ch/R-manual/R-devel/library/base/html/Logic.htmlJak logiczny operator negacji "!" działa

To działa na mnie, gdy używany w połączeniu z =, w wyrażeniach takich jak:

1 != 2 
TRUE 

Ale nie mogę zupełnie zrozumieć autonomicznego stosowania tego operatora. Na przykład, czy mogę go użyć do wybrania elementów listy, które nie mają określonej nazwy. Oto moja próba to zrobić, ale to nie działa:

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] 

moje wyjście jest:

Error in !x : invalid argument type 

docenią żadnych wskazówek, gdzie moja logika idzie nie tak w tym przypadku, a jakie są inne dobre używa tego operatora z wyjątkiem! = case.

Dzięki! Sergey

Odpowiedz

13

Po pierwsze, to chyba najlepiej nie myśleć o != jak ! działającej na =, ale raczej jako oddzielny operator binarny całkowicie.

Ogólnie rzecz biorąc, ! należy stosować wyłącznie do wektorów logicznych. Więc to jest chyba bardziej przypomina to, czego po:

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

gdzie names(l) %in% x zwraca logiczną wektor wzdłuż nazwiskami na liście l wskazującą, czy są one zawarte w x czy nie. Na koniec uniknąłem użycia zmiennej list, ponieważ widzisz, że jest to dość powszechna funkcja.

+0

joran, wielkie dzięki za wyjaśnienia i wyjaśnienia, wszystko ma sens teraz dla mnie. –

8

Po pierwsze, myślę, że ! w != nie jest operatorem !. Jest to odrębny operator !=, który oznacza "inny niż".

drugie, operator ! jest logiczna, logiczną negacją i musi być stosowana do logicznego Vector:

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

jak numery mogą być zmuszane do logiczny, może być również doprowadzane do wektor liczbowy. W tym przypadku 0 będą traktowane jako FALSE i każda inna wartość jako TRUE:

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

W przykładzie staramy się stosować ten operator logiczny ciąg znaków, który powoduje błąd.

Jeśli chcesz zestawić listy, ramki danych lub wektory według nazw, indeksów lub warunków, powinieneś przeczytać i dowiedzieć się o indeksującej części języka R, która jest opisana w podręcznikach R i większości książek wprowadzających i dokumenty.

Jednym ze sposobów podzbiór listę według nazw może być, na przykład:

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

zgadzam się ze wszystkim wspomniany przez dwóch innych plakatów, ale chcę dodać jeszcze jedną rzecz zawsze sprawdzić kiedy nauczania R.

R działa w ten sposób, że ocenia wyciągi z wnętrza na zewnątrz, a każde z tych stwierdzeń musi działać samodzielnie. Jeśli masz już błąd w wewnętrznym stwierdzeniu, nic dziwnego, że ci ludzie nie produkują niczego.

W twoim przypadku można powiedzieć, że masz dwie instrukcje: !x i dostęp do listy list przez [.

Jeśli replikować zachowanie R jest zauważyć, że !x już produkuje błąd:

> !x 
Error in !x : invalid argument type 

Stąd poprawne rozwiązania starają się zmienić ten krok.

A więc: Zawsze sprawdzaj najskrytsze wypowiedzi w przypadku wystąpienia błędów i pracuj na zewnątrz.