Ich habe eine generische Funktion namens foo
. Es funktioniert anders in den Klassen bar
und baz
, aber es gibt einige gemeinsame Vorverarbeitung, die nur einmal durchgeführt werden müssen. Was ist der idiomatische Weg, dies auszuführen?R-Muster zum Ändern von Argumenten an generische Funktion übergeben
In meinem albernen Beispiel unten möchte ich das Objekt, das an das generische übergeben wird, mit 10 multiplizieren. Doch wenn die Methode aufgerufen wird, wird der ursprüngliche Wert auf die Konsole gedruckt. Ich habe die Sprachdefinition gelesen und weiß, dass das folgende Muster nicht funktioniert. Meine Frage ist: Wo oder wie soll ich die gemeinsame Verarbeitung von generischen Argumenten behandeln, bevor ich die Methode aufruft?
a <- structure(1:5, class="bar")
b <- structure(6:10, class="baz")
foo <- function(x) {
x <- x * 10 # where should shared preprocessing go?
UseMethod("foo")
}
foo.bar <- function(x) {
cat("Foo!", x)
}
foo.baz <- function(x) {
cat("Baz!", x)
}
# does not propagate the operations carried out `foo`
foo(a)
foo(b)
Auch nicht elegant, wenn, würde ich wählen, nur den offensichtlichen Weg und neu eingeben sowohl 'foo.bar' und' foo.baz' die Vorverarbeitung Teils. Alternativ definieren Sie eine Funktion, die den gemeinsamen Teil ausführt (ohne sie zu exportieren): '.preprocess <-function (x) #do stuff 'und dann' foo.bar <-function (x) {x <-. Preprocess (x) ; #do andere Sachen} 'und das selbe für' foo.baz'. – nicola