2009-04-21 106 views
7

我一直在努力學習更多關於R(和編寫C擴展),我認爲這可能有助於閱讀一些知名軟件包的源代碼。我決定先從軟件rpart作爲其定義:函數參數如何在不提及函數體的情況下使用?

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

我沒有通過源快速搜索,我看不出公式中的函數體中任何地方提到但我知道,不知何故rpart包使用該參數。 rpart如何使用公式名稱不在函數體內?

回答

9

這是很棘手:

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

函數使用match.call找出它是如何被調用,修改呼叫通過model.frame更換調用的函數,並通過eval所收到的參數,調用它(雖然# ...取代的部分刪除了幾個參數),並且model.frame使用formula參數。參見match.call,evalmodel.frame的文檔,並稍微進行一些實驗,例如,試着瞭解這裏發生了什麼:

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 
相關問題