Когда вы вызываете
cutoff(x) <- 65
, вы фактически вызываете
x <- "cutoff<-"(x = x, value = 65)
Имя функции должно быть указано как синтаксически действительное, но нестандартное имя и синтаксический анализатор интерпретируют <-
как оператор не как часть имени функции, если он не был указан.
"cutoff<-"()
подобен любой другой функции (хотя и с странным именем); он меняет свой входной аргумент на основе value
(в этом случае он устанавливает любое значение в x
больше, чем 65
на Inf
(бесконечное)).
магия действительно выполняется, когда вы вызываете функцию, подобную этой
cutoff(x) <- 65
, потому что R анализирует это и вытягивает различные биты, чтобы сделать реальный вызов, показанный выше.
В более общем плане мы имеем
FUN(obj) <- value
R находит функцию "FUN<-"()
и устанавливает вызов, передавая obj
и value
в "FUN<-"()
, а упорядочивает результат "FUN<-"()
, который будет назначен на obj
, поэтому он вызывает:
obj <- "FUN<-"(obj, value)
Полезной ссылкой для этой информации является раздел определения языка g0] R 3.4.4: Назначение подмножества ; дискуссия немного наклонная, но, по-видимому, она является самой официальной ссылкой (функции замены упоминаются в распространении часто задаваемых вопросов R (различия между R и S-PLUS) и в справочной системе R (различные технические проблемы), но я не нашел дальнейшего обсуждения в официальной документации).
Создать набор партий, а затем создать задачу для каждого элемента в пакете, выполняющего работу (параллельно)
async Task Main()
{
var batchSize = 10;
var batches = logins.Select((item, inx) => new { item, inx })
.GroupBy(x => x.inx / batchSize)
.Select(g => g.Select(x => x.item));
foreach (var batch in batches)
{
var tasks = new List<Task>(batchSize);
foreach (var login in batch)
{
tasks.Add(DoWork());
}
await Task.WhenAll(tasks);
}
}
public async Task DoWork()
{
if (await _serviceLoginInjected.LogIn(login))
{
await _serviceLoginInjected.SendEmails();
await _serviceLoginInjected.CreateFiles();
await _serviceLoginInjected.DoSomethingElse();
}
}