Я должен изменить 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
. Когда я выполняю этот код получение ошибки:
Ошибка в оценке (expr, envir, enclos): 'nthcdr' нужен список к CDR вниз
Который я не понимаю очень хорошо. lm2
метод работает очень хорошо, когда выполнено за пределами stat_smooth
. Я играл с этим немного, и у меня есть различные типы ошибки, но так как я не доволен отладчиками R, для меня трудно отладить их. Честно, я не получаю то, что я должен вставить return()
звонить.
Есть некоторая странность в использовании ... в качестве аргумента в вызове функции, который я не совсем понимаю (это как-то связано с .. .является объектом типа списка).
Вот версия, которая работает, принимая вызов функции как объект, устанавливая функцию для вызова на 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)