Совокупность только в определенных строках с data.table

Вы вызываете неправильный метод. Вам нужно

srcPaneUsers.setContent(myGridPane);

Метод getChildren(), определенный в Parent, является защищенным методом. Он переопределяется в Pane как общедоступный метод, поэтому для макетов (GridPane, BorderPane и т. Д.) Вы можете напрямую манипулировать списком дочерних узлов.

ScrollPane - это ScrollPane extends Control extends Region extends Parent, поэтому он наследует метод protected getChildren(). И это на самом деле имеет смысл: дочерние узлы ScrollPane - это такие вещи, как окно просмотра (которое зажимает представление содержимого) и полосы прокрутки: вы действительно не хотите, чтобы пользователь манипулировал ими, в противном случае вы в конечном итоге получаете скорее всего, не будет функционировать правильно. ScrollPane действительно имеет только один узел, который настраивается: узел, из которого ScrollPane предоставляет представление: это называется его content и доступ через contentProperty(), getContent() и setContent() ].

Аналогичным образом работают другие «контейнероподобные элементы управления». Класс TabPane предоставляет метод getTabs(), который возвращает ObservableList; и класс Tab, в свою очередь, предоставляет contentProperty(), чтобы вы могли получить доступ к содержимому каждой отдельной вкладки. Вкладка SplitPane предоставляет метод getItems(), возвращающий ObservableList для узлов, отображаемых на панели. В случае SplitPane его дочерние узлы больше, чем элементы: они включают визуальные компоненты, представляющие разделители, и т. Д. В обоих случаях метод getChildren() является защищенным методом (унаследованным от Parent).

Обратите внимание, что Parent также определяет общедоступный метод getChildrenUnmodifiable(), который возвращает немодифицируемое представление списка дочерних узлов. Вы можете использовать это, чтобы проверить иерархию узлов любого родителя, но не изменять его. (Однако для целей отладки, особенно для работы с CSS, я рекомендую использовать ScenicView .)

3
задан Jaap 13 July 2018 в 14:14
поделиться

2 ответа

Два возможных подхода:

# option 1:
dt[, roll_mn := roll_mean(value, 30, fill = NA, align = "right") * NA^(day != 15)]

# option 2:
dt[, roll_mn := ifelse(day == 15, roll_mean(value, 30, fill = NA, align = "right"), NA)]

вы получаете:

> dt[1:100]
           date day        value    roll_mn
  1: 2017-01-01   1 -0.422983983         NA
  2: 2017-01-02   2 -1.549878162         NA
....
 13: 2017-01-13  13  0.712481269         NA
 14: 2017-01-14  14 -0.445772094         NA
 15: 2017-01-15  15  0.248979648         NA
 16: 2017-01-16  16 -1.074193951         NA
 17: 2017-01-17  17 -1.827261716         NA
....
 44: 2017-02-13  13  1.054362321         NA
 45: 2017-02-14  14 -0.148639594         NA
 46: 2017-02-15  15  1.018076577 -0.1322037
 47: 2017-02-16  16 -0.721586512         NA
 48: 2017-02-17  17 -0.778778137         NA
....
 72: 2017-03-13  13  0.565180699         NA
 73: 2017-03-14  14 -0.006097837         NA
 74: 2017-03-15  15 -0.438781066  0.1109928
 75: 2017-03-16  16  0.688891096         NA
 76: 2017-03-17  17 -0.499419195         NA
....
 99: 2017-04-09   9 -0.657354771         NA
100: 2017-04-10  10  0.922903744         NA

Тест на набор данных lager (включая не- -equi join, упомянутый @Frank в комментариях):

# create benchmark dataset
set.seed(2018)
dt <- data.table(date = seq.Date(as.Date("0-01-01"), as.Date("2017-12-31"), by = "1 day"))
dt[, `:=` (day = day(date), value = rnorm(nrow(dt)))]

# benchmark
> system.time(dt[, v1 := roll_mean(value, 30, fill = NA, align = "right") * NA^(day != 15)])
   user  system elapsed 
  0.011   0.000   0.011 
> system.time(dt[, v2 := ifelse(day == 15, roll_mean(value, 30, fill = NA, align = "right"), NA)])
   user  system elapsed 
  0.034   0.005   0.039 
> system.time(dt[day == 15, v3 := dt[.SD[, .(d_dn = date - 30, d_up = date)], on=.(date > d_dn, date <= d_up), mean(value), by=.EACHI]$V1])
   user  system elapsed 
  0.043   0.001   0.044 

Предупреждение: подход без привязки к соединению также даст значение для первой строки, где day == 15


Используемые данные:

set.seed(2018)
dt <- data.table(date = seq.Date(as.Date("2017-01-01"), as.Date("2017-12-31"), by = "1 day"))
dt[, `:=` (day = day(date), value = rnorm(nrow(dt)))]
2
ответ дан Jaap 17 August 2018 в 12:43
поделиться
  • 1
    Вычисляет ли это все из них, а затем устанавливает весь день! = 15 в NA? Похоже на это, но я никогда не видел этого NA ^ использования раньше. Я стараюсь избегать ненужных вычислений. – fsumathguy 13 July 2018 в 14:03
  • 2
    @fsumathguy Это правда, добавил еще один вариант. – Jaap 13 July 2018 в 14:10
  • 3
    Это потрясающе. Спасибо. Настолько просто в ретроспективе. – fsumathguy 13 July 2018 в 14:15
  • 4
    Оба варианта вычисляют их все, не так ли? (Я думаю, вы знаете stackoverflow.com/questions/16275149/… ) Я думаю, вы должны рассмотреть объединение без equi, возможно: dt[day == 15, v := dt[.SD[, .(d_dn = date - 30, d_up = date)], on=.(date > d_dn, date <= d_up), mean(value), by=.EACHI]$V1] Глядя на dt[c(46, 74)], я вижу, что он соответствует вашим значениям , но они не сравнились ни с чем. – Frank 13 July 2018 в 17:20
  • 5
    @fsumathguy Интересное обсуждение, главным образом на NaN^0, но также и на NA^0, можно найти здесь: Почему NaN ^ 0 == 1 – Henrik 13 July 2018 в 21:42
0
ответ дан jasbner 17 August 2018 в 12:43
поделиться
Другие вопросы по тегам:

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