Überladen des tiefgestellten Operators "[" in R

9

Ich versuche, den tiefgestellten Operator ( "[" ) für eine benutzerdefinierte Klasse zu überladen, die ich erstellt habe. Ich versuche herauszufinden, wie ich mit den folgenden Problemen umgehen kann.

  • Wie können Sie herausfinden, ob der Operator auf lhs oder rhs steht? d.h. a[x] = foo vs foo = a[x]
  • Wenn ich die gesamte Dimension wie foo = a[,x] subskribiere, wie kann ich den ersten Parameter identifizieren?
  • Bei Verwendung von [seq (x, y)] scheint die gesamte Sequenz zu expandieren. Gibt es eine einfache Möglichkeit, die ersten, die letzten und die letzten Werte ohne Erweiterung zu erhalten?

BEARBEITEN: Mein erster Punkt hat mehrere Antworten erhalten. Dabei habe ich die Antwort auf die zweite herausgefunden. Sie können die "fehlende" Funktion verwenden, um herauszufinden, welche Parameter vorhanden sind.

Hier ist ein Beispielcode:

%Vor%

Ich habe eine Antwort auf diese Frage akzeptiert, da Nummer 3 für mich am wenigsten Priorität hat.

    
Pavan Yalamanchili 14.03.2014, 14:32
quelle

4 Antworten

5

Für den ersten Aufzählungspunkt gibt es zwei Funktionen zum Überladen:

  1. [
  2. [<-

Die erste Funktion gibt den Wert zurück und die zweite den Wert. Siehe die Dokumentation für Extract.data.frame{base}

    
f.jamitzky 14.03.2014, 14:45
quelle
8

Entdecken Sie das Generische, damit Sie wissen, was Sie implementieren möchten:

%Vor%

Und:

%Vor%

Dann implementierst du es zum Beispiel so:

%Vor%     
agstudy 14.03.2014 14:53
quelle
5

Siehe die Quelle für [.data.frame als Beispiel. Du hast ein x, ein i und ein j in dieser Reihenfolge.

%Vor%

Sie können etwas Ähnliches tun:

%Vor%

Reihenfolge ist irrelevant. Die i's und j's haben recht:

%Vor%     
Ari B. Friedman 14.03.2014 14:49
quelle
1

Was den dritten Punkt betrifft, könnten Sie etwas wie folgt verwenden:

%Vor%

Diese Funktion gibt die Argumente an seq ,

zurück %Vor%

oder das konventionelle bewertete Argument,

%Vor%

Ich bin mir jedoch nicht sicher, ob das eine gute Praxis ist. Außerdem müssen Sie die Parameter in seq sorgfältig interpretieren, sie könnten unbenannt sein und statt to könnte length.out etc.

sein     
Karsten W. 14.03.2014 16:12
quelle

Tags und Links