Как я могу определить местоположение определенного типа в блоке *эффективно*?

Я не уверен, что есть способ сделать это без использования 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 ...
5
задан starblue 25 April 2009 в 09:02
поделиться

4 ответа

Прежде всего можно попытаться использовать 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 */);
4
ответ дан 14 December 2019 в 13:48
поделиться

Блок. GetExportedTypes () только возвращает общедоступные классы. Это могло помочь?

1
ответ дан 14 December 2019 в 13:48
поделиться

Наша сменная система использует атрибуты для идентификации сменных типов. Мы затем просто сканируем блок для определенного атрибута.

0
ответ дан 14 December 2019 в 13:48
поделиться

Решение из сообщения в списке рассылки 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] , действительно нуждаются в быть загруженным, что может значительно уменьшить объем памяти потребляется (в зависимости от количества типов в сборке).

1
ответ дан 14 December 2019 в 13:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: