Я не уверен, что есть способ сделать это без использования gather
и spread
. Вот как бы я это сделал. Сначала я изменил бы данные на «длинные», затем нам нужно использовать group_by
, чтобы мы вычисляли только cumsum
для каждой строки в исходном data.frame
(если это недостаточно сгруппировано, мы можем добавить row_number
к данным и group_by
, что). После этого мы mutate
, а затем spread
вернули данные в «широкий». Наконец, мы добавляем select(names(df))
, как предлагает @Gregor, чтобы сохранить исходный порядок столбцов.
df %>%
gather(variable, value, contains('R_')) %>% # reshape wide to long
group_by(LoB, AY) %>% # group by for each row in original data
mutate(value = cumsum(value)) %>% # calculate cumsum
spread(variable, value) %>% # reshape back from long to wide
select(names(df)) # added to retain original column order
# LoB AY R_0 R_1 R_2 R_3 ...
# <fct> <dbl> <dbl> <dbl> <dbl> <dbl> ...
# 1 1 1994 50135 126766 155529 155529 ...
# 2 1 1995 46530 51438 54072 55481 ...
# 3 1 1996 38295 68722 69096 69566 ...
# 4 1 1997 12033 16301 16301 16301 ...
Прежде всего можно попытаться использовать GetExportedTypes()
сужать список потенциальных типов. Кроме этого, нет никакого способа, которым можно ускорить итеративный процесс. Можно, однако, включать сменную декларацию, которая указала бы точный тип (типы) плагинов в рамках конкретного блока:
<manifest>
<plugin type="FooBar.Plugins.BazPlugin, FooBar" />
</manifest>
так, чтобы Вы смогли бы сделать Type.GetType(string)
IPlugin plugin = (IPlugin)Type.GetType("manifest/plugin/@type" /* for the sake of this discussion */);
Блок. GetExportedTypes () только возвращает общедоступные классы. Это могло помочь?
Наша сменная система использует атрибуты для идентификации сменных типов. Мы затем просто сканируем блок для определенного атрибута.
Решение из сообщения в списке рассылки mono-devel от Джонатана Прайора и Plug-in Framework (Часть 1): Типы маркировки для потребления : используйте атрибуты уровня сборки .
Короче говоря, вы должны добавить новый атрибут:
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple=true)]
class PluginAttribute : Attribute {
public PluginAttribute (Type type) {this.Type = type;}
public Type Type {get; private set;}
}
Затем укажите этот атрибут на уровне сборки:
[assembly:Plugin (typeof(Plugin1))]
[assembly:Plugin (typeof(Plugin2))]
Затем запросите сборку для всех атрибутов PluginAttributes:
Assembly a = ...;
PluginAttribute[] plugins =
(PluginAttribute[]) a.GetCustomAttributes (
typeof(PluginAttribute), true);
foreach (var plugin in plugins)
// plugin.Type is the type to use as a plugin
Это может быть значительно быстрее, чем использование Assembly.GetTypes ()
/ Assembly.GetExportedTypes ()
, поскольку только
типы, перечисленные в атрибутах [assembly: Plugin]
, действительно нуждаются в
быть загруженным, что может значительно уменьшить объем памяти
потребляется (в зависимости от количества типов в сборке).