Измените функцию lm или loess, чтобы использовать ее в geom_smooth ggplot2

Мне нужно изменить lm (или в конце концов loess), чтобы я мог использовать его в ggplot2 geom_smooth (или же stat_smooth).

Например, вот как stat_smooth используется обычно:

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

Я хотел бы определить обычай lm2 функция для использования в качестве значения для method параметр в 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() вызов.

1 ответ

Решение

Есть некоторая странность в использовании... в качестве аргумента при вызове функции, которую я не до конца понимаю (это как-то связано с... быть объектом типа списка).

Вот версия, которая работает, принимая вызов функции как объект, устанавливая функцию для вызова на 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'

Если вы хотите сбросить аргументы в foo перед вызовом lm, вы можете сделать это следующим образом

x$useless <- NULL

Кстати, geom_smooth а также stat_smooth передать любые дополнительные аргументы в функцию сглаживания, поэтому вам не нужно создавать собственную функцию, если вам нужно только установить некоторые дополнительные аргументы

qplot(data=diamonds, carat, price, facets=~clarity) + 
  stat_smooth(method="loess",span=0.5)
Другие вопросы по тегам