Zgodnie z definicją języka R różnica między &
i &&
(odpowiednio |
i ||
) polega na tym, że pierwsze jest wektoryzowane, a drugie nie.
Zgodnie z tekstem pomocy czytam różnicę podobną do różnicy między „And” i „AndAlso” (odpowiednio „Or” i „OrElse”) ... Znaczenie: To nie wszystkie oceny, jeśli nie muszą być (tzn. A, B lub C są zawsze prawdziwe, jeśli A jest prawdziwe, więc przestań oceniać, czy A jest prawdziwe)
Czy ktoś mógłby tu rzucić światło? Czy jest też AndAlso i OrElse w R?
Odpowiedzi:
Krótsze są wektoryzowane, co oznacza, że mogą zwrócić wektor w następujący sposób:
Dłuższa forma ocenia od lewej do prawej, badając tylko pierwszy element każdego wektora, więc powyższe daje
Jak mówi strona pomocy, powoduje to, że dłuższa forma jest „odpowiednia do programowania kontroli przepływu i zwykle jest preferowana w klauzulach if”.
Więc chcesz używać długich formularzy tylko wtedy, gdy masz pewność, że wektory mają długość jeden.
Powinieneś być absolutnie pewien, że twoje wektory mają tylko długość 1, na przykład w przypadkach, gdy są funkcjami, które zwracają tylko logiczne długości 1. Chcesz użyć krótkich formularzy, jeśli wektory mają długość prawdopodobnie> 1. Więc jeśli nie masz absolutnej pewności, powinieneś albo najpierw sprawdzić, albo użyć krótkiego formularza, a następnie użyć
all
iany
zmniejszyć go do długości jednego do użycia w instrukcjach przepływu kontroli, takich jakif
.Funkcje
all
iany
są często używane w wyniku porównania wektorowego, aby sprawdzić, czy odpowiednio wszystkie lub jakiekolwiek porównania są prawdziwe. Wyniki tych funkcji z pewnością będą miały 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 użycia wifelse
.Jedna końcowa różnica:
&&
i||
tylko oceniają tyle terminów, ile potrzebują (co wydaje się być tym, co rozumie się przez zwarcie). Na przykład, oto porównanie przy użyciu niezdefiniowanej wartościa
; jeśli nie spowoduje zwarcia, tak jak&
i|
nie, spowoduje błąd.Na koniec zobacz sekcję 8.2.17 w R Inferno , zatytułowaną „oraz and and and”.
źródło
c(TRUE, FALSE)
, aif
stwierdzenie nie byłoby jasne. Jeśli jesteś pewien, że wszystko ma długość 1, to tak, zrobi to i masz rację, że „zwarcie” jest powodem, dla którego preferujesz jeden. Słowo ostrzeżenia, upewnij się, że masz 100% pewności, że mogą być tylko pierwsze. W przeciwnym razie możesz dostać naprawdę głupie błędy.?is.R
sprawdzania, czy korzystasz z R czy S-Plus.if(exists("is.R") && is.function(is.R) && is.R())
. Jeśliis.R
nie istnieje, nie chcesz oceniać,is.function(is.R)
ponieważ spowoduje to błąd. Podobnie, jeśliis.R
nie jest funkcją, nie chcesz jej tak nazywać.Odpowiedź na temat „zwarcia” jest potencjalnie myląca, ale zawiera pewną prawdę (patrz poniżej). W języku R / S
&&
i||
oceniaj tylko pierwszy element w pierwszym argumencie. Wszystkie inne elementy w wektorze lub liście są ignorowane bez względu na pierwszą wartość. Operatory te są zaprojektowane do pracy zif (cond) {} else{}
konstrukcją i do bezpośredniego sterowania programem, a nie do konstruowania nowych wektorów. Operatory&
i|
są zaprojektowane do pracy z wektorami, więc będą one stosowane „równolegle”, że tak powiem, wzdłuż najdłuższy argument. Oba wektory należy ocenić przed dokonaniem porównań. Jeśli wektory nie są tej samej długości, następuje ponowne przetworzenie krótszego argumentu.Gdy argumenty do
&&
lub||
są oceniane, następuje „zwarcie” polegające na tym, że jeśli dowolna z następujących po sobie wartości od lewej do prawej ma znaczenie determinujące, wówczas oceny są przerywane i zwracana jest wartość końcowa.Zaleta zwarcia pojawi się tylko wtedy, gdy ocena argumentów zajmuje dużo czasu. Zwykle ma to miejsce, gdy argumentami są funkcje, które albo przetwarzają większe obiekty, albo mają bardziej złożone operacje matematyczne.
źródło
&&
i||
.&&
są funkcje, a pierwszy jest fałszywy, to drugi nie zostanie oceniony. Nie dotyczy to&
ani jednego, ani tego,ifelse
który oceni oba argumenty.&&
i||
są nazywane „zwarciem”. Oznacza to, że nie będą oceniać drugiego argumentu, jeśli pierwszy argument będzie wystarczający do ustalenia wartości wyrażenia.Na przykład, jeśli pierwszy argument
&&
jest fałszywy, nie ma sensu oceniać drugiego argumentu, ponieważ nie może on zmienić wartości wyrażenia (false && true
ifalse && false
oba są fałszywe). 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 możesz zobaczyć, że
&&
jest to odpowiednikAndAlso
VB.NET, do którego zakładam, że masz na myśli.źródło
f <- function() { print('hello'); TRUE }; FALSE && f()
. Zmień&
i zauważ, że funkcja jest oceniana. CO BYŁO DO OKAZANIA.&&
i||
zwarcie. Ale to naprawdę niewielka kwestia w porównaniu krótkiej i długiej formy; o wiele ważniejsze jest zrozumienie, co każdy robi, gdy dane wejściowe są wektorami.F & {message("Boo!");T}
iF && {message("Boo!");T}
.