2017-02-26 2 views
0

Ich schreibe eine Funktion in R mit dem Standard data Argument, d. H. Das Argument übergibt den Namen eines Datenrahmens, wie es in lm Funktion getan wird. Ich möchte eine Funktion haben, die mit genannt werden kann:Wie behandelt man das Argument "Daten" in einer Funktion?

func(a,data=d) 

und ohne:

func(d$a) 

data Argument. Der Einfachheit halber soll die Funktion den Mittelwert eines Vektors berechnen. Wie kann ich es tun?

+1

Die Daten selbst werden normalerweise an das Datenargument übergeben - nicht an seinen Namen. z. B. "mtcars", nicht "mtcars". Ich denke, du musst Code zeigen, um Antworten zu bekommen. –

+0

Ich würde vorschlagen, Hadleys Advanced R Kapitel auf [Nicht-Standard-Bewertung] (http://adv-r.had.co.nz/Computing-on-the-language.html): Es tut gut Job durch mehrere Beispiele zu gehen, die dies beinhalten. – r2evans

+0

Das Buch "Advanced R" ist sehr informativ. Vielen Dank! – Viktor

Antwort

1

Hier sind einige Möglichkeiten. Die Tests verwenden alle den integrierten Datenrahmen BOD.

1) S3 Sie können einen S3-generic mit data.frame und Standardmethoden schreiben:

func1 <- function(x, data) UseMethod("func", if (missing(data)) x else data) 
func1.data.frame <- function(x, data) mean(data[[x]]) 
func1.default <- mean 

# test 

func1("Time", BOD) 
## [1] 3.666667 

func1(BOD$Time) 
## [1] 3.666667 

2) wenn Die oben ist ein wenig ungewöhnlich und Sie können nur ein lieber verwenden, wenn :

func2 <- function(x, data) if (missing(data)) mean(x) else mean(data[[x]]) 

func2("Time", BOD) 
## [1] 3.666667 

func2(BOD$Time) 
## [1] 3.666667 

3) nicht-Standard-Auswertung Sie auch nicht-Standard-Auswertung verwenden könnten, obwohl dies in der Regel nicht zu empfehlen:

func3 <- function(x, data) { 
    if (missing(data)) 
     mean(x) 
    else 
     eval(substitute(mean(x)), data) 
} 

func3(Time, BOD) 
## [1] 3.666667 

func3(BOD$Time) 
## [1] 3.666667 

4) Formel Ein anderer Weg, um es zu nähern, ist eine Formel verwendet werden, die von der Form sein muss, wo ~ XX ist eine Spalte in data oder ein Objekt in der Umgebung der Formel. Wenn data nicht angegeben wird, wird standardmäßig die Umgebung des Aufrufers verwendet. Das heißt, es sieht zuerst in data aus und wenn nicht dort gefunden wird, sieht es in der Umgebung der Formel aus.

func4 <- function(x, ...) UseMethod("func4") 
func4.formula <- function(x, data = parent.frame()) { 
     p <- parse(text = all.vars(x)) 
     e <- eval(p, data, environment(x)) 
     mean(e) 
} 
func4.default <- mean 

func4(~Time, BOD) 
## [1] 3.666667 

v <- BOD$Time 
func4(~v) 
## [1] 3.666667 

func4(BOD$Time) 
## [1] 3.666667 
+0

Vielen Dank für die Antwort, aber ich möchte nicht, dass Daten das erste Argument sind. Tatsächlich kann das erste Argument für meine Funktion die 'glm' Klasse sein oder ein numerischer Vektor sein. (Also wird 'UseMethod' die Umschaltung für dieses erste Argument vornehmen.) – Viktor

+0

Sie können das Objekt angeben, das an' UseMethod' gesendet werden soll. Siehe '? UseMethod'. Ich habe das Beispiel modifiziert, um 'data' zum zweiten arg zu machen; Die Konstruktion ist jedoch etwas ungewöhnlich. –

+0

Bitte beachten Sie, dass die Definition von 'func2' ungültig ist. Versuchen Sie es einfach 'd = data.frame (a = 1: 10); func2 (a, d) ' – Viktor

Verwandte Themen