Мы могли бы внести эти изменения:
test$cummulative_time
могут быть просто cumulative_time
breaks
могут быть разложены и затем использованы в cut
, как показано mutate
может быть изменен на summarize
, в этом случае select
и distinct
не нужны group_by
с соответствующим ungroup
complete
, чтобы вставить 0 для уровней, которых нет Реализуя эти изменения, мы имеем:
library(dplyr)
library(tidyr)
breaks <- seq(0, 40, 10)
test %>%
mutate(bin_durations = cut(cumulative_time, breaks = breaks,
labels = breaks[-1], include.lowest = TRUE)) %>%
group_by(Id,bin_durations) %>%
summarize(total_duration = sum(duration)) %>%
ungroup %>%
complete(Id, bin_durations, fill = list(total_duration = 0))
, дающих: [ 1120]
# A tibble: 8 x 3
Id bin_durations total_duration
<dbl> <fct> <dbl>
1 1 10 1018
2 1 20 53
3 1 30 2175.
4 1 40 0
5 2 10 684
6 2 20 780
7 2 30 175
8 2 40 0
При попытке динамично инстанцировать подтипа, и у Вас есть тип как строка, можно сделать это:
'SpecialEvent'.constantize.new()
Нет, я хочу создать экземпляры подтипов, где я хочу программно определить, какой sub_type они – HermanD
Вы могли использовать шаблон "фабрика", хотя я недавно услышал, что люди осуждают злоупотребление этим шаблоном. В основном используйте фабрику для создания фактических типов, которые Вы хотите получить
class EventFactory
def EventFactory.create_event(event_type)
event_type.constantize.new()
end
end
По-видимому, направляющие не позволяет Вам устанавливать Тип непосредственно. Вот то, что я делаю...
klass_name = 'Foo'
...
klass = Class.const_get(klass_name)
klass.new # Foo.new
Я полагаю, что .constantize является направляющими inflector ярлык. const_get является методом Ruby на Классе и Модуле.
from "Pragmatic - Agile Web Development with rails 3rd edition", page 380
There’s also a less obvious constraint (with STI). The attribute type is also the name of a built-in Ruby method, so accessing it directly to set or change the type of a row may result in strange Ruby messages. Instead, access it implicitly by creating objects of the appropriate class, or access it via the model object’s indexing interface, using something such as this:
person[:type] = 'Manager'
man, this book really rocks