تعديل وظيفة LM أو LOESS لاستخدامها داخل GGPLOT2 من GEOM_SMOOTH
سؤال
أحتاج إلى تعديل 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 ، env ، explos): يحتاج 'nthcdr'
الذي لا أفهمه جيدًا. ال 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)