Erzwingt bestimmte Datentypen als Argumente für eine Funktion

8

Ich habe mich gefragt, ob es eine Möglichkeit gibt, eine Funktion zu zwingen, nur bestimmte Datentypen zu akzeptieren, ohne sie innerhalb der Funktion zu überprüfen. Oder ist das nicht möglich, weil die Typüberprüfung von R zur Laufzeit ausgeführt wird (im Gegensatz zu Programmiersprachen wie Java, wo die Typüberprüfung während der Kompilierung durchgeführt wird)?

In Java müssen Sie beispielsweise einen Datentyp angeben:

%Vor%

In R könnte eine ähnliche Funktion

sein %Vor%

, aber wenn ein Vektor geliefert wird, wird (offensichtlich) ein Vektor zurückgegeben. Wenn Sie nur eine einzige Ganzzahl akzeptieren möchten, ist die einzige Möglichkeit, eine Bedingung innerhalb der Funktion festzulegen, in der Form

%Vor%

Danke, Danke Chris

    
ChrisW 21.08.2011, 17:15
quelle

3 Antworten

16

Dies ist mit S3-Klassen durchaus möglich. Ihr Beispiel ist im Kontext oder R etwas erfunden, da ich mir keinen praktischen Grund vorstellen kann, warum man eine Klasse mit einem einzelnen Wert erstellen möchte. Dies ist jedoch möglich. Als zusätzlichen Bonus demonstriere ich, wie die Funktion addon verwendet werden kann, um den Wert von eins zu numerischen Vektoren (trivial) und Zeichenvektoren (so dass sich A zu B usw. ändert) hinzuzufügen:

Beginnen Sie mit der Erstellung einer generischen S3-Methode für addone unter Verwendung des S3-Bereitstellungsmechanismus UseMethod :

%Vor%

Als nächstes erstellen Sie die erfundene Klasse single , definiert als das erste Element von allem, was an sie übergeben wird:

%Vor%

Erstellen Sie jetzt Methoden, um die verschiedenen Klassen zu behandeln. Die Standardmethode wird aufgerufen, sofern keine bestimmte Klasse definiert ist:

%Vor%

Schließlich, testen Sie es mit einigen Beispieldaten:

%Vor%

Einige zusätzliche Informationen:

  1. Hadleys devtools Wiki ist eine wertvolle Quelle für Informationen über alle Dinge, einschließlich das S3-Objektsystem .

  2. Die S3-Methode bietet keine strenge Typisierung. Es kann leicht missbraucht werden. Schärfere Objektorientierung finden Sie in den S4-Klassen , Referenzbasierte Klassen oder das Proto-Paket für prototypbasierte Programmierung.

Andrie 21.08.2011, 18:37
quelle
4

Sie könnten einen Wrapper wie den folgenden schreiben:

%Vor%

Und benutze es wie

%Vor%

Etwas unbequem gemacht von R ohne Dekorateure. Das ist eine Art Hacky und es leidet unter einigen ernsten Problemen:

  1. Sie verlieren faule Bewertung, weil Sie ein Argument zur Bestimmung auswerten müssen sein Typ.

  2. Sie können die Typen immer noch nicht bis zur Anrufzeit überprüfen. echte statische Typprüfung können Sie die Typen sogar eines Anrufs überprüfen, der nie wirklich geschieht.

Da R Lazy Evaluation verwendet, kann (2) die Typprüfung nicht sehr nützlich machen, weil der Aufruf möglicherweise erst sehr spät oder nie stattfindet.

Die Antwort auf (2) wäre, statische Information hinzuzufügen. Das könntest du wahrscheinlich tue dies, indem du Ausdrücke transformierst, aber ich denke nicht, dass du dorthin gehen willst.

    
Owen 21.08.2011 19:10
quelle
3

Ich habe festgestellt, dass stopifnot () auch für diese Situationen sehr nützlich ist.

%Vor%

Der Grund, warum es so nützlich ist, ist, dass es eine ziemlich klare Fehlermeldung für den Benutzer liefert, wenn die Bedingung falsch ist.

    
Brandon Bertelsen 22.08.2011 00:09
quelle

Tags und Links