Измените функцию 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)