Die Berücksichtigung umschließender Frames beim Abrufen des Feldwerts einer S4-Referenzklasse wird vermieden

8

Ich bin ein großer Fan von S4-Referenzklassen, da sie einen hybriden Programmierstil ermöglichen (funktional / pass-by-value vs. oop / pass-by-reference; beispiel ) und erhöhen damit die Flexibilität erheblich.

Ich denke jedoch, dass ich gerade auf ein unerwünschtes Verhalten in Bezug auf die Art und Weise stieß, wie R durch Umgebungen / Frames scrollt, wenn Sie einen bestimmten Feldwert über die Methode $field() abfragen (siehe Hilfeseite ). Das Problem ist, dass R auch in umschließenden Umgebungen / Frames zu suchen scheint, wenn das gewünschte Feld nicht in der tatsächlichen lokalen / Zielumgebung gefunden wird (was die Umgebung der S4 Referenzklasse wäre), dh es ist genauso wie get(<objname>, inherits=TRUE) (Siehe Hilfeseite ).

Aktuelle Frage

Damit R nur in der lokalen / Zielumgebung angezeigt wird, habe ich etwas wie $field(name="<fieldname>", inherits=FALSE) gedacht, aber $field() hat kein ... Argument, das es mir erlauben würde inherits=FALSE mit% weiterzugeben co_de% (was ich vermute, wird irgendwo auf dem Weg genannt). Gibt es einen Workaround dafür?

Codebeispiel

Für diejenigen, die sich für mehr Details interessieren: Hier ist ein kleines Codebeispiel, das das Verhalten veranschaulicht

%Vor%

Es gibt ein Feld get() in der Klasse a , so dass es in der Zielumgebung gefunden wird und der Wert zurückgegeben wird:

%Vor%

Die Dinge sehen anders aus, wenn wir versuchen, auf ein Feld zuzugreifen, das nicht ein Feld der Referenzklasse ist, aber zufällig einen Namen hat, der mit einem anderen Objekt im Arbeitsbereich / Suchpfad identisch ist Fall A ):

%Vor%

Nicht wirklich, was ich zu diesem Zeitpunkt erwarten würde. IMHO ein Fehler oder zumindest eine Warnung wäre viel besser. Oder die Methode "lm" für Argumente öffnen, die über $field() an andere Funktionen übergeben werden können. Ich vermute irgendwo auf dem Weg ... wird aufgerufen, wenn get() aufgerufen wird, also könnte etwas wie das obige Verhalten verhindern:

%Vor%

Workaround: eigenes Angebot

Dies sollte den Trick bringen, aber vielleicht gibt es etwas eleganteres, das nicht die Spezifikation einer neuen Methode oberhalb von $field() beinhaltet:

%Vor%     
Rappster 20.03.2013, 16:27
quelle

1 Antwort

1

Die Standardmethode field() kann durch Ihre eigene ersetzt werden. Das Hinzufügen eines inherits -Arguments, um die umschließenden Frames zu vermeiden, ist einfach eine Sache, die vorhandene x$field -Definition zu erfassen und sie hinzuzufügen ...

%Vor%

Oder Sie könnten eine nette Fehlermeldung mit ein wenig Umordnung

haben %Vor%

Da Sie jede Ihrer eigenen Methoden definieren können, um die Standardeinstellungen zu ersetzen, können Sie jede gewünschte Logik für Ihre Refclasses implementieren. Vielleicht ein Fehler, wenn die Variable durch Vererbung erfasst wird, aber der Modus mit c ("Ausdruck", "Name", "Symbol", "Funktion") und einer Warnung übereinstimmt, wenn sie nicht direkt mit den lokalen RefClass-Feldnamen übereinstimmt?

    
Thell 16.06.2013, 23:08
quelle