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 ~ X
X
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
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. –
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
Das Buch "Advanced R" ist sehr informativ. Vielen Dank! – Viktor