List.Generate(()=>[s=1,i=0,n=1], each [i]<6,each [i=[i]+1,n=[s]+1,s=[s]+n], each [n])
Я так понимаю: 1. ()=>[s=1,i=0,n=1] - это Функция initial , которая не имеет аргументов и ее вычисленное значение равно значению выражения, указанного внутри нее, то есть s=1 i=1 n=1 Не подскажете , почему здесь квадратные скобки []?
2. each [i]<6 - Это функция Condition , которая принимает на вход s=1 i=1 n=1 из функции inital в предыдущем шаге и проверяет для каждой строки (each) условие [i]<6
3.если Condition на шаге 2 вернул True, то вычисляется 4й параметр функции List.generate под названием Selector = each [n]. Функция Selector вычисляет следующий элемент списка. В нашем случае 2й элемент списка будет равен 1 , так как из 1го шага пришел [n] =1
4. если Condition на шаге 2 вернул True , то переходим к третьему параметру функции List.generate под названием Next = each [i=[i]+1,n=[s]+1,s=[s]+n] . Функция Next вычисляет следующие значения параметров s i n для использования их заново во 2м и 3м шаге. То есть, на выходе next вернет список [i=1, n=2, s = 3] и мы снова идем на 2й шаг , проверять условие each[i] <6
Поправьте пожалуйста, если я где-то ошибаюсь в рассуждениях
buchlotnik написал: нет, вычисляется третий; а из третьего Selector берет необходимое, в данном случае только значение поля n.
Спасибо за ответ. По поводу Selector берет из третьего параметра под названием Next значение поля n...
Как же так? Допустим считаем Первая итерация: 1. ()=>[s=1,i=0,n=1] - initial 2. each [i]<6 - Condition вернул True 3. переходим к третьему параметру функции List.generate под названием Next = each [i=[i]+1,n=[s]+1,s=[s]+n] . То есть, на выходе next вернет список [i=1, n=2, s = 3]
4.вычисляется 4й параметр функции List.generate под названием Selector = each [n]. То есть, вернется [n] =2 , так как в третьем шаге функция next вернула [n] =2 , То есть, получается , что по такой логике первая итерация вернет нам 2 , а на самом деле возвращает 1...
не так выразился, Selector ничего не считает, он берет текущее значение; т.е. на первой итерации возьмет из Initial, а далее как бы из Next предыдущего шага если опустить последний аргумент
Код
= List.Generate(()=>[s=1,i=0,n=1], each [i]<6,each [i=[i]+1,n=[s]+1,s=[s]+n])
можно увидеть полностью результаты выполнения итераций - на каждом шаге у нас есть запись из которой Selector берет значение, т.е. берет не из аргумента функции, а из памяти. Не знаю как это еще объяснить
buchlotnik, подскажите пожалуйста еще такой нюанс, как сделать так, чтобы эту формулу можно было использовать для вычисления значения в ячейке в столбце П как на картинке
Код
=Table.AddColumn(#"Добавлен индекс", "П", each List.Generate(()=>[s=1,i=0,n=1], each [i]<#"Добавлен индекс"{2}[Индекс],each [i=[i]+1,n=[s]+1,s=[s]+n], each [n]))
Сейчас на картинке вычисление в столбце П не верное, так как Condition ДЛЯ КАЖДОЙ строки проверяет [i] по фиксированной строке
Код
#"Добавлен индекс"{2}[Индекс]
и для каждой строки выдает список 1, 2 ,4
А нужно , как - то сделать так, чтобы для каждой строки выдавался свой список. То есть, для строки с Индексом 1 , нужен список составленный по Condition
Код
each [i]<#"Добавлен индекс"{0}[Индекс]
Для строки с Индексом 2 , нужен список составленный по Condition
Код
each [i]<#"Добавлен индекс"{1}[Индекс]
Для строки с Индексом 3 , нужен список составленный по Condition
Код
each [i]<#"Добавлен индекс"{2}[Индекс]
Для строки с Индексом 4 , нужен список составленный по Condition
= Table.AddColumn(#"Добавлен индекс", "П", each [a=[Индекс], b = List.Generate(()=>[s=1,i=0,n=1], each [i]<a,each [i=[i]+1,n=[s]+1,s=[s]+n], each [n])][b])
Вот здесь я сделал расчет этой формулы в Power BI, но не удалось этот расчет сделать точно также как в Экселе, где столбец E рассчитывается сам в себе.
В DAX непонятно как вычислить параметр add4 , который используется для расчета столбца Col , не по столбцу E, а по самому столбцу Col, как это умеет Эксель...