Единственное Наследование Таблицы направляющих - Что лучший способ состоит в том, чтобы явно установить тип?

Мы могли бы внести эти изменения:

  • 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 
10
задан buræquete 28 April 2017 в 03:57
поделиться

4 ответа

При попытке динамично инстанцировать подтипа, и у Вас есть тип как строка, можно сделать это:

'SpecialEvent'.constantize.new()
22
ответ дан 3 December 2019 в 13:41
поделиться

Нет, я хочу создать экземпляры подтипов, где я хочу программно определить, какой sub_type они – HermanD

Вы могли использовать шаблон "фабрика", хотя я недавно услышал, что люди осуждают злоупотребление этим шаблоном. В основном используйте фабрику для создания фактических типов, которые Вы хотите получить

class EventFactory
  def EventFactory.create_event(event_type)
    event_type.constantize.new()
  end
end
5
ответ дан 3 December 2019 в 13:41
поделиться

По-видимому, направляющие не позволяет Вам устанавливать Тип непосредственно. Вот то, что я делаю...

klass_name = 'Foo'
...
klass = Class.const_get(klass_name)
klass.new # Foo.new

Я полагаю, что .constantize является направляющими inflector ярлык. const_get является методом Ruby на Классе и Модуле.

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

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

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

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