existiert und sapply: Warum unterscheiden sich diese Funktionen?

8

Warum sind die beiden Funktionen fn und gn unter verschieden? Ich denke nicht, dass sie es sein sollten, aber ich muss etwas vermissen.

%Vor%

Es gibt zwei Unterschiede:

  1. gn(d=2) sagt, dass d existiert, aber warum nicht fn(d=2) ?
  2. fn(d=2) sagt, dass i existiert, wenn gn(d=2) nicht existiert. Das ist verwirrend, weil ich i nirgendwo definiert habe.

Hinweis: Dies ist auf R Version 3.2.0, es scheint, das zweite Verhalten ist neu für diese Version (siehe unten).

    
petrelharp 17.06.2015, 00:50
quelle

4 Antworten

6

Warum i ist anders ...

Es sieht so aus, als ob sich Änderungen in R 3.2 ergeben hätten. Eine Indexvariable i wurde zur aktuellen Umgebung hinzugefügt von lapply (was sapply tatsächlich aufruft). Dies geht einher mit dem neuen Verhalten, um die Auswertung der Parameter zu erzwingen, die an die Funktion übergeben werden, für die Sie sich bewerben. Dies bedeutet, dass Sie jetzt Zugriff auf den Index der aktuellen Iteration haben, in der Sie sich in der Schleife befinden.

Der Grund dafür, dass fn und gn sich anders verhalten, ist, dass exists() in der Umgebung aussieht, in der es aufgerufen wird. Im Fall von fn ist dies die Umgebung, in der diese Variable i erstellt wurde. Im Falle von gn sucht es in der Umgebung Ihrer anonymen Funktion. Wenn R ein Symbol in der lokalen Umgebung nicht finden kann, durchsucht es Umgebungen basierend darauf, wo Funktionen definiert wurden und nicht wo sie aufgerufen werden. Dies bedeutet, dass R die Variable i nicht finden wird, da Ihre anonyme Funktion an einer Stelle definiert ist, an der die Variablen i nicht existieren.

Wir können eine kleine Hilfsfunktion schreiben, um den aktuellen Index leichter zu finden.

%Vor%

Soweit ich das beurteilen kann, ist dies momentan undokumentiertes Verhalten. Es kann sich in zukünftigen Versionen von R ändern.

Warum d ist anders ...

Die Diskrepanz mit der Variable d ist ein direkteres Problem mit dem Geltungsbereich. Erneut erzeugt R eine neue Umgebung, in der er die Funktion exists aufruft. Das übergeordnete Element dieser Umgebung ist die Basisumgebung. Wenn Sie also exists aufrufen, sieht es aus, wo es aufgerufen wurde (in dieser Umgebung ist i vorhanden), und da dort d nicht gefunden wird, wird das nächste übergeordnete Element gesucht, bei dem es sich um die Basisumgebung handelt. Die aktuelle Funktionsumgebung wird nie gesucht. Sie könnten die aktuelle Umgebung explizit mit

durchsuchen %Vor%

Weitere Informationen zu Umgebungen in RI finden Sie im Bereich "Umgebungen" von Advanced R

>     
MrFlick 17.06.2015, 14:54
quelle
1

Der wichtige Unterschied ist der Wert für "d", der Name der formalen Variable im Aufruf. . Die Standardeinstellungen für die Funktion exists sehen "über" nicht "in" aus. In der ersten Instanz gibt es in der .GlobalEnv-Instanz, in der die Funktionen aufgerufen wurden, keine Entität mit dem Namen "d". In der zweiten Instanz gibt es d (als Name) in der Umgebung.

Leute, die "i" oder "c" finden, finden die Funktion c oder einen Index für eine for-Schleife. (Die Indexvariable bleibt am Ende einer For-Schleife bestehen.)

Es scheint, dass der "i" -Wertunterschied nur in der neuesten Version ist, die ich auf diesem Rechner nicht gesehen habe, da er bei 3.1.3 mit meiner aktuellen OS-Version ausgereizt ist. Es könnte auch bei Personen vorkommen, die "i" als Indexvariable in einer For-Schleife in einer aktuellen Sitzung verwendet haben (oder mit einer früheren gespeicherten Umgebung gearbeitet haben).

    
42- 17.06.2015 02:30
quelle
0

In Bezug auf i konnte ich es nicht reproduzieren. Aber ich werde versuchen, die anderen Unterschiede zu erklären, zuerst die c , die beide Funktionen finden und die d , die nur gn() findet.

Beide Funktionen finden c , weil sie die Basisfunktion c finden.

Nun zu d , R ist lexikalisch begrenzt. Vielleicht möchten Sie diese Frage Umgebungen in R, mapply und holen . Also, in der ersten Funktion fn() sucht exists nicht in der lokalen Umgebung von d nach fn() , sondern in der globalen Umgebung (und dort ist kein d vorhanden).

Beachten Sie jedoch, dass Sie in gn() die Funktion definieren, die exists() als anonyme Funktion in gn() verwendet. Schau:

%Vor%

Die Umgebung von gn() ist also die übergeordnete Umgebung der anonymen Funktion function (x) { exists(x) } . Deshalb sucht es in gn und findet das lokale Argument d , wobei TRUE zurückgegeben wird.

    
Carlos Cinelli 17.06.2015 02:28
quelle
0

Es ist ein seltsames Verhalten. Ich bin mir sicher, dass es eine vernünftige Erklärung dafür gibt. Hier ist eine brandneue R-Sitzung. Ich habe dieses Mal nicht einmal RStudio verwendet, das die gleiche Ausgabe erzeugt.

%Vor%

Mehr seltsames Verhalten:

%Vor%

Sowohl mapply als auch rapply return FALSE . Beide benötigen auch Listen als Argumente. Das könnte etwas damit zu tun haben. Vielleicht heben die anderen anwendbaren Funktionen etwas in einer Umgebung von R auf, die die bare-Funktion und einige anwendbare Funktionen nicht sind.

    
Pierre Lafortune 17.06.2015 05:13
quelle

Tags und Links