Это о зависимостях. Вы хотите, чтобы Ваш код зависел от интерфейсных типов вместо конкретных типов в соответствующих случаях. Например, у Вас могло бы быть несколько конкретных типов, что все выполняют подобное поведение, но реализуют его по-другому. Вы хотите, чтобы Ваша кодовая база имела зависимости от тех нескольких конкретных типов или один интерфейс? Как гибкий Вы думаете, что Ваша кодовая база будет, когда необходимо будет внести изменения?
К Вашей точке о не желании использовать общедоступных участников при помощи состава, я сказал бы, что Вы просто инкапсулируете ненужные зависимости. Если Вы хотите использовать состав, то Вы значительно уменьшаете зависимости путем создания интерфейсных типов вместо конкретных типов.
Для лучшего объяснения, попытайтесь смотреть на литературу по инверсия управления .
Один из способов - создать data.frame со средними значениями заранее.
library(reshape)
dfs <- recast(data.frame(cat1, cat2, val), cat1+cat2~variable, fun.aggregate=mean)
qplot(val, data=df, geom="histogram", binwidth=0.2, facets=cat1~cat2) + geom_vline(data=dfs, aes(xintercept=val), colour="red") + geom_text(data=dfs, aes(x=val+1, y=1, label=round(val,1)), size=4, colour="red")
Я предполагаю, что это переработка @ Eduardo действительно, но в одной строке.
ggplot(df) + geom_histogram(mapping=aes(x=val))
+ geom_vline(data=aggregate(df[3], df[c(1,2)], mean),
mapping=aes(xintercept=val), color="red")
+ facet_grid(cat1~cat2)
Text Text http://www.imagechicken.com/uploads/1264782634003683000.png[121683000.png
Plyr Plyr
( Требование (PLYR)
Пакет автором GGPLOT , Хэдли):
ggplot(df) + geom_histogram(mapping=aes(x=val))
+ geom_vline(data=ddply(df, cat1~cat2, numcolwise(mean)),
mapping=aes(xintercept=val), color="red")
+ facet_grid(cat1~cat2)
Кажется неудовлетворительным, что влайн не разрезается на грани, я не уверен, почему.