我正在尝试在R中编写自己的建模函数,它需要接收一个公式、一些数据,以及可能的一些额外上下文信息,比如权重;在调用model.frame
提取必要的数值数据后,它将进行拟合。我的第一次尝试如下:
my_modfunc <- function(formula,data,weights=NULL) {
mf <- model.frame(formula,data=data,weights=weights)
wt <- model.weights(mf)
# do some fitting here...
}
# make fake data to test it
set.seed(1234)
data <- data.frame(x1=rnorm(50),x2=rnorm(50),y=rnorm(50),w=runif(50))
# call it:
my_modfunc(y ~ x1 + x2,data=data,weights=w)
这个失败了,我收到了错误信息:
Error in model.frame.default(formula, data = data, weights = weights) :
invalid type (closure) for variable '(weights)'
同样,如果我调用:my_modfunc(y ~ x1 + x2,data=data,weights='w')
我遇到了同样的错误。我怀疑环境、引号等方面存在问题。
将
lm
的源代码剪切并粘贴,我可以将我的函数重写为:# based on lm
weird_modfunc <- function(formula,data,weights=NULL ) {
cl <- match.call() # what?
mf <- match.call(expand.dots = FALSE) # what??
m <- match(c("formula", "data", "weights"), names(mf), 0L)
mf <- mf[c(1L, m)] # ??
mf$drop.unused.levels <- TRUE # ??
mf[[1L]] <- quote(stats::model.frame) ## ???
mf <- eval(mf, parent.frame())
wt <- as.vector(model.weights(mf))
# do some fitting here...
}
# this runs without error:
weird_modfunc(y ~ x1 + x2,data=data,weights=w)
# this fails with the same error as above about variable lengths.
weird_modfunc(y ~ x1 + x2,data=data,weights='w')
问题在于这里包含了多个我不知道如何解释、修改或维护的神秘咒语。
调用 model.frame
的正确方式是什么?如果能让我的函数同时接受 weights=w
和 weights='w'
,那就更好了。
as.symbol
的转换。 - shabbychef