【发布时间】:2015-04-22 17:27:23
【问题描述】:
我想编写一个函数来评估数据框中的表达式,但是使用可能包含或不包含用户定义对象的表达式来执行此操作。 我认为神奇的词是“非标准评估”,但我现在还不太清楚。
一个简单的例子(但对我的目的来说很现实):比如说,我想评估一个 lm() 调用以查找数据框中的变量。
mydf <- data.frame(x=1:10, y=1:10)
这样做的函数可以写成如下:
f <- function(df, expr){
expr <- substitute(expr)
pf <- parent.frame()
eval(expr, df, pf)
}
这样我就可以使用以下命令得到我想要的。
f(mydf, lm(y~x))
# Call:
# lm(formula = y ~ x)
#
# Coefficients:
# (Intercept) x
# 1.12e-15 1.00e+00
很好。但是,在某些情况下,在调用lm() 之前将模型方程保存在对象中会更方便。不幸的是,上面的函数不再这样做了。
fml <- y~x
f(mydf, lm(fml))
# Error in eval(expr, envir, enclos): object 'y' not found
有人可以解释为什么第二个电话不起作用吗?如何更改函数,以便两个调用都会导致预期的结果? (期望=拟合模型)
干杯!
【问题讨论】:
标签: r object dataframe expression evaluation