2016-07-13 26 views
1

In der Funktion Quelle für stats::bw.nrd0 gibt es eine komplizierte (für mich) if Aussage:Wie interpretiere Doppel "oder" || und Zuordnung, wenn Klausel

> bw.nrd0 
function (x) 
{ 
    if (length(x) < 2L) 
     stop("need at least 2 data points") 
    hi <- sd(x) 
    if (!(lo <- min(hi, IQR(x)/1.34))) 
     (lo <- hi) || (lo <- abs(x[1L])) || (lo <- 1) 
    0.9 * lo * length(x)^(-0.2) 
} 
<bytecode: 0x0000000010c688b0> 
<environment: namespace:stats> 

Ist || in besonderer Weise interpretiert zu werden, im Vergleich zu dem regulären Operator |? Wo/wie wird lo zugewiesen/neu zugewiesen? Wie wäre das in "langer Form" geschrieben?

Volle Offenlegung, habe ich versucht, diese Funktion in eine Python-Funktion in this answer zu übersetzen, also wenn Sie dies beantworten können, können Sie auch eine bessere Antwort auf diese Frage hinzufügen.

+1

Wenn logische ODER wird in Zuordnung verwendet, bedeutet typischerweise „, wenn diese erste truthy ist, weisen Sie auf die Variable, sonst weise die zweite Sache zu und es bedeutet wahrscheinlich "wenn hi truthig ist, weise es zu, sonst weise abs (x [1L]) zu." Disclaimer: Ich weiß nicht r. – Carcigenicate

+1

Wenn das richtig ist, kann Python folgendes tun: 'x = falsyVal oder truthyVal' – Carcigenicate

+1

' "||" 'ist eine Art Kurzschlussvergleich (zB' TRUE || stop ("erreicht") 'VS' TRUE | stop ("erreicht") ') Der Fall 'lo' wird neu zugewiesen, bis sein Wert _firstly_, evaluiert wird ates zu 'WAHR'. Z.B. '(x <- 1) || (x <- 2) || (x <-1); x; (x <- 0) || (x <- 2) || (x <-1); x 'etc –

Antwort

2

Dank einiger hilfreichen Kommentare, ich verstehe jetzt, dass dies bedeutet, dass, wenn lo == 0, weisen wir in dieser Reihenfolge zu welchem ​​von hi, abs(x[1]) oder 1 nicht Null ist zuerst. In Python, könnten wir schreiben:

lo = min(hi, iqr/1.34) 
lo = lo or hi or abs(x[0]) or 1 

oder expliziter:

if not lo: 
    if hi: 
     lo = hi 
    elif abs(x[0]): 
     lo = abs(x[0]) 
    else: 
     lo = 1 
1

von der Hilfe-Dokumentation:

& und & & zeigen logische UND und | und || Zeigen Sie ein logisches ODER an. Die verkürzte Form führt Element-ähnliche Vergleiche ähnlich wie arithmetische Operatoren durch. Das längere Formular wertet von links nach rechts aus und untersucht nur das erste Element jedes Vektors. Die Auswertung wird nur fortgesetzt, bis das Ergebnis ermittelt wurde. Die längere Form ist geeignet für die Programmierung von Ablaufsteuerung und in if-Klauseln in der Regel bevorzugt.