将函数参数传递给R中的公式

时间:2014-09-10 00:27:02

标签: r

我试图了解原因

foo = function(d,y,x) {
    fit = with(d, lm(y ~ x))
}
foo(myData, Y, X)

赢了工作,例如

myData = data.frame(Y=rnorm(50), X=runif(50))

对我来说似乎很棘手的一点是将参数xy传递给公式,就像在lm(y ~ x)中一样。

2 个答案:

答案 0 :(得分:3)

@ DMT的答案很好地解释了发生了什么。

如果你想让事情像你期望的那样工作,那么就可以跳过这些箍:

lmwrap <- function(d,y,x) {
    ys <- deparse(substitute(y))
    xs <- deparse(substitute(x))
    f <- reformulate(xs,response=ys)
    return(lm(f,data=d))
}
mydata <- data.frame(X=1:10,Y=rnorm(10))
lmwrap(mydata,Y, X)

这种方法有点脆弱,例如如果你通过另一个函数传递参数。另外,让公式中的“调用”部分读取Y~X需要更多的诡计......

答案 1 :(得分:0)

Y和X是您的列名,而不是变量。在这种情况下,他们不会成为你的函数的参数,除非你把它们作为字符串传递并基本上调用

lm(mydata[,"Y"]~ mydata[,"X"])

如果您在控制台上运行ls(),Y和X很可能不在那里,因此该功能不起作用。在fit = call之前打印x和y,你可能会看到NULL,它们不会在lm中飞行。

在表单中执行此操作的一种方法是以下

lmwrap<-function(df, yname, xname){
fit=lm(d[,yname] ~ d[,xname])
}

lmwrap(mydata,"Y", "X")

但你可以像常规的那样让lm调用