2009-04-21 21 views
7

R (ve C uzantıları yazarken) hakkında daha fazla şey öğrenmeye çalışıyorum ve iyi bilinen bazı paketlerin kaynağını okumaya yardımcı olabileceğini düşündüm. Ben olarak tanımlanan rpart ile başlatmaya karar: Ben kaynağı yoluyla hızlı bir arama yaptımBir işlev parametresi, işlev gövdesinde belirtmeden nasıl kullanılabilir?

rpart <- function(formula, data, weights, subset, 
     na.action=na.rpart, method, model=FALSE, x=FALSE, y=TRUE, 
     parms, control, cost, ...) 

ve formülü henüz ben bir şekilde rpart o parametreyi kullandığını biliyoruz yerde işlev gövdesinde sözü görmüyorum. Rpart'ın adı, işlev gövdesinde bulunmayan formülü nasıl kullanıyor?

m <- match.call(expand.dots = FALSE) 
# ... 
m[[1L]] <- as.name("model.frame") 
m <- eval(m, parent.frame()) 

işlev, bu çağrıldığını öğrenmek için match.call kullanır model.frame tarafından çağrılan işlevi yerine aramayı değiştirir ve (aldığı parametrelerle eval yoluyla çağırır:

cevap

9

Oldukça aldatıcı # ... ile değiştirdiğim bölüm, birçok parametreyi kaldırır) ve model.frame, formula parametresini kullanır. match.call, eval ve model.frame belgelerine bakın ve biraz deneyin, örn. burada neler olduğunu anlamaya çalış:

f <- function(formula, data) { 
    m <- match.call() 
    m[[1L]] <- as.name('model.frame') 
    eval(m, parent.frame()) 
} 
f(x ~ y) 
Error in eval(expr, envir, enclos) : object 'x' not found 
x <- c(1,2,3) 
f(x ~ y) 
Error in eval(expr, envir, enclos) : object 'y' not found 
y <- c(3,4,5) 
f(x ~ y) 
    x y 
1 1 3 
2 2 4 
3 3 5 
d <- as.data.frame(matrix(c(1,2,3,4),nrow=2)) 
names(d) <- c('foo', 'bar') 
f(foo ~ bar, d) 
    foo bar 
1 1 3 
2 2 4 
İlgili konular