Operatory logiczne & & i ||

Zgodnie z definicją języka R różnica między & a && (odpowiednio | i ||) polega na tym, że pierwszy jest wektoryzowany, a drugi nie.

Zgodnie z tekstem pomocy , odczytałem różnicę zbliżoną do różnicy między " And " I "AndAlso" (odpowiednio " Or "i " OrElse")... Znaczenie: Że nie wszystkie oceny, jeśli nie muszą być (tj. A lub B lub C jest zawsze prawdziwe, jeśli A jest prawdziwe, więc przestań Oceniać, Jeśli a jest true)

Czy ktoś mógłby rzucić tu światło? Czy w R jest AndAlso i OrElse?
Author: matt, 2011-07-02

3 answers

Krótsze są wektoryzowane, co oznacza, że mogą zwrócić wektor, tak:

((-2:2) >= 0) & ((-2:2) <= 0)
# [1] FALSE FALSE  TRUE FALSE FALSE

Dłuższa forma ocenia od lewej do prawej badając tylko pierwszy element każdego wektora, więc powyższe daje

((-2:2) >= 0) && ((-2:2) <= 0)
# [1] FALSE

Jak mówi strona pomocy, to sprawia, że dłuższa forma " jest odpowiednia do programowania sterowania przepływem i [jest] zazwyczaj preferowana w klauzulach if."

Więc chcesz używać długich form tylko wtedy, gdy jesteś pewien, że wektory są długości 1.

Powinieneś być absolutnie pewne Twoje wektory mają tylko długość 1, np. w przypadkach, gdy są funkcjami zwracającymi tylko długość 1. Chcesz użyć krótkich form, jeśli wektory mają długość > 1. Jeśli więc nie jesteś do końca pewien, powinieneś najpierw sprawdzić, albo użyć krótkiej formy, a następnie użyć all i any, Aby zmniejszyć ją do długości jednej do użycia w instrukcjach sterowania przepływem, takich jak if.

Funkcje all i any są często używane na wyniku wektoryzowanego porównanie, aby sprawdzić, czy wszystkie lub którekolwiek z porównań są prawdziwe, odpowiednio. Wyniki z tych funkcji na pewno mają długość 1, więc są odpowiednie do użycia w klauzulach if, podczas gdy wyniki z wektoryzowanego porównania nie są. (Chociaż wyniki te byłyby odpowiednie do stosowania w ifelse.

Ostatnia różnica: && i || oceniają tylko tyle terminów, ile potrzebują (co wydaje się być tym, co oznacza zwarcie). Na przykład, oto porównanie za pomocą wartość niezdefiniowana a; gdyby nie zwarcie, tak jak & i | nie, spowodowałoby to błąd.

a
# Error: object 'a' not found
TRUE || a
# [1] TRUE
FALSE && a
# [1] FALSE
TRUE | a
# Error: object 'a' not found
FALSE & a
# Error: object 'a' not found

Wreszcie, patrz punkt 8.2.17 w R Inferno , zatytułowany "and andand".

 274
Author: Aaron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-25 20:00:03

Odpowiedź na temat "zwarcie" jest potencjalnie myląca ,ale ma pewną prawdę(patrz poniżej). W języku R/S, && i || oceniają tylko pierwszy element w pierwszym argumencie. Wszystkie pozostałe elementy w wektorze lub liście są ignorowane niezależnie od pierwszych wartości. Operatory te są zaprojektowane do pracy z konstrukcją if (cond) {} else{} i kierowania kontrolą programu, a nie konstruowania nowych wektorów.. Operatory & i | są zaprojektowane do pracy na wektorach, więc będzie stosowany "równolegle", że tak powiem, wzdłuż długości najdłuższego argumentu. Jeśli wektory nie są tej samej długości, to wykonuje się recykling krótszego argumentu.

Gdy argumenty do && lub || są oceniane, występuje "zwarcie" w tym, że jeśli którakolwiek z wartości kolejno od lewej do prawej są determinatywne, to oceny kończą się i zwracana jest ostateczna wartość.

> if( print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 2
> if(FALSE && print(1) ) {print(2)} else {print(3)} # `print(1)` not evaluated
[1] 3
> if(TRUE && print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 2
> if(TRUE && !print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 3
> if(FALSE && !print(1) ) {print(2)} else {print(3)}
[1] 3
 22
Author: 42-,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-09 13:24:38

&& i || są tym, co nazywa się "zwarciem". Oznacza to, że nie będą oceniać drugiego operanda, jeśli pierwszy operand wystarczy do określenia wartości wyrażenia.

Na przykład, jeśli pierwszy operand && jest false, to nie ma sensu Oceniać drugiego operandu, ponieważ nie może zmienić wartości wyrażenia (false && true i false && false są false). To samo dotyczy ||, gdy pierwszy operand jest prawdziwy.

Możesz przeczytać więcej na ten temat tutaj: http://en.wikipedia.org/wiki/Short-circuit_evaluation z tabeli na tej stronie widać, że {[0] } jest równoważne AndAlso w VB.NET, o czym zakładam, że mówisz.

 17
Author: Theo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-02 19:00:38