10

我需要修改lm(或最终loess)函数,以便可以在 ggplot2 geom_smooth(或stat_smooth)中使用它。

例如,这是stat_smooth正常使用的方式:

> qplot(data=diamonds, carat, price, facets=~clarity) + stat_smooth(method='lm')`

我想定义一个自定义lm2函数用作methodin 参数的值stat_smooth,这样我就可以自定义它的行为。

> lm2 <- function(formula, data, ...)
  {
      print(head(data))
      return(lm(formula, data, ...))
  }
> qplot(data=diamonds, carat, price, facets=~clarity) + stat_smooth(method='lm2')

请注意,我已method='lm2'stat_smooth. 当我执行此代码时,出现错误:

eval 中的错误(expr,envir,enclos):“nthcdr”需要一个列表来 CDR 下来

我不太明白。该lm2方法在stat_smooth. 我玩了一下,遇到了不同类型的错误,但由于我对 R 的调试工具不满意,所以我很难调试它们。老实说,我不明白我应该在return()电话中输入什么。

4

1 回答 1

6

在我不完全理解的函数调用中使用 ... 作为参数有一些奇怪之处(它与 ... 作为一个列表类型的对象有关)。

这是一个版本,它将函数调用作为一个对象,将要调用的函数设置为 lm,然后在我们自己的调用者的上下文中评估调用。此评估的结果是我们的返回值(在 R 中,函数中最后一个表达式的值是返回的值,因此我们不需要显式的return)。

foo <- function(formula,data,...){
   print(head(data))
   x<-match.call()
   x[[1]]<-quote(lm)
   eval.parent(x)
}

如果要向 lm 调用添加参数,可以这样做:

x$na.action <- 'na.exclude'

如果你想在调用 lm 之前将参数放到 foo 中,你可以这样做

x$useless <- NULL

顺便说一句,geom_smooth并将stat_smooth任何额外的参数传递给平滑函数,因此如果您只需要设置一些额外的参数,则无需创建自己的函数

qplot(data=diamonds, carat, price, facets=~clarity) + 
  stat_smooth(method="loess",span=0.5)
于 2010-03-04T02:45:45.280 回答