我一直被一个错误所困扰,这个错误可以追溯到predict.lme,它在函数内部运行,无法解释基于从函数外部传递的变量的公式。我知道这个问题与变量范围和不同的环境有关,但我一直无法完全理解它或找到解决方案。非常感谢您的帮助。
下面是一个可重复的例子:
# This will be the nested function.
train_test_perf <- function(train_data, test_data, model, termLabels) {
fixForm <- reformulate(termlabels=termLabels, response="Y")
fit <- nlme::lme(fixForm, data=train_data, random=~ 1|ID)
train_pred <- predict(fit, newdata=train_data, level=0, na.action=na.exclude)
rtrain <- cor.test(train_data$Y, train_pred)
test_pred <- predict(fit, newdata=test_data, level=0, na.action=na.exclude)
rtest <- cor.test(test_data$Y, test_pred)
tmp <- data.frame(Model=model,
R_train=rtrain$estimate,
R_test=rtest$estimate)
return(tmp)
}
# And here is the function that calls it.
myfunc <- function(df, newdf, varList) {
for (v in varList) {
perf <- train_test_perf(train_data=df, test_data=newdf, model=v, termLabels=v)
print(perf)
}
}
# The outer function call.
myfunc(df=dat, newdf=newdat, varList=list("W", "X"))
运行此命令将产生以下错误和追溯:
Error in eval(mCall$fixed) : object 'fixForm' not found
7.
eval(mCall$fixed)
6.
eval(mCall$fixed)
5.
eval(eval(mCall$fixed)[-2])
4.
predict.lme(fit, newdata = train_data, level = 0, na.action = na.exclude)
3.
predict(fit, newdata = train_data, level = 0, na.action = na.exclude)
2.
train_test_perf(train_data = df, test_data = newdf, model = v,
termLabels = v)
1.
myfunc(df = dat, newdf = newdat, varList = list("W", "X"))
很明显predict.lme不能访问fixForm变量,但是我还没有找到一种方法,既可以基于变量定义公式,又可以访问predict.lme的值。我不确定嵌套函数结构是否是问题的一部分--如果是,我希望找到一种能够维护这种结构的解决方法,因为我的实际代码在myfunc中包含了一些其他的东西,它们发生在train_test_perf调用之前和之后。
谢谢你,
杰夫·菲利普斯
1条答案
按热度按时间von4xj4u1#
使用变量作为公式并不存储变量,而不是公式,这可能是问题所在,我们可以使用
do.call
。最后将其放入
sapply
中以避免繁琐的for
循环。