Новый (в 2014 году) tidyr
пакет также делает это просто, при этом gather()
/ spread()
является слагаемыми для melt
/ cast
.
library(tidyr)
spread(dat1, key = numbers, value = value)
Из github ,
tidyr
- это перерисовкаreshape2
, предназначенная для сопровождения аккуратной структуры данных и работающая рука об руку сmagrittr
иdplyr
, чтобы построить сплошной конвейер для анализа данных.Так же, как
blockquote>reshape2
сделал меньше, чем изменение,tidyr
делает меньше, чемreshape2
. Он разработан специально для сбора данных, а не для общей перестройки, которую делаетreshape2
, или общего преобразования, которое изменилось. В частности, встроенные методы работают только для кадров данных, аtidyr
не содержит полей или агрегации.
CLR использует выделенный поток, чтобы отслеживать активные таймеры System.Timers.Timer и System.Threading.Timer. Событие Elapsed поднимается на другой поток, вытащенный из потока.
Итак, да, они продолжают тикать, не затрагивая друг друга. Вы должны быть очень осторожны, вполне возможно, что ваш обработчик события Elapsed будет вызван снова, пока он все еще выполняется. Это происходит, когда это занимает больше времени, чем интервал. Или, что еще хуже, когда машина сильно загружена или у вас много активных потоков threadpool. Это может привести к очень тяжелой диагностике сбоя, если обработчик событий не является потокобезопасным. Это почти никогда не бывает. Установка свойства AutoReset таймера на значение false - это простой способ избежать этой проблемы.
Похоже, что он не будет блокироваться, если вы используете System.Threading.Timer или вызовите System.Timers.Timer без SynchronizingObject.
Аналогичный вопрос: Выполняют таймеры C # в отдельном потоке ?
Из документации System.Timers.Timer
:
Таймер на основе сервера предназначен для использования с рабочими потоками в многопоточной среде. Таймеры сервера могут перемещаться между потоками для обработки поднятого события Elapsed, что приводит к большей точности, чем таймеры Windows, во время всплытия события.
blockquote>Итак, да.
В дальнейшем, из документации свойства
System.Timers.Timer.SynchronizingObject
:Когда SynchronizingObject имеет значение null, метод, обрабатывающий событие Elapsed, вызывается в потоке из пула системных потоков. Дополнительные сведения о пулах системных потоков см. В статье ThreadPool.
blockquote>Таким образом, события поднимаются в потоках пула потоков, если не установлен параметр SynchronizingObject.