KDB + / q Индексирование в функциях - PullRequest
1 голос
/ 05 октября 2019

Я новичок в языке KDB + / q и пытаюсь выполнить некоторые базовые онлайн-упражнения.

Я пытаюсь создать функцию, которая принимает список и возвращает список с удвоенным вторым элементом в списке.

L:{[x;y] y:[1]; y*2; x}

Моя попытка состоит в том, что я назначил функцию L, обрисовывая в общих чертах мои параметры x и y, а затем моя логика заключается в назначении 2-го элемента в списке путем индексации значения y и умножения этого значения на 2. Я использовал x, потому что хотел назначить списокна x и затем я вывожу x в конце функции. Каждый раз, когда я проверял это, вводя список L 10 20 30 40 50, я не видел никаких изменений во втором пункте. Мне нужна помощь в том, является ли мой синтаксис неправильным или логика или оба. В настоящее время я использую Q для смертных в качестве ссылки. Если это мой синтаксис, то это неправильно. Каков правильный синтаксис для функций в q?

Ответы [ 2 ]

3 голосов
/ 06 октября 2019

В вашем примере вы устанавливаете y в 1 и возвращаете x без изменений.

Правильный синтаксис для вашего метода будет одним из следующих:

{[x]x[1]:2*x[1];x}
{[x]x[1]*:2;x}

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

Альтернативный и, возможно, более чистый способ:

{[x]@[x;1;2*]}

, который применяет функцию 2* ко второму элементу.

2 голосов
/ 06 октября 2019

Есть несколько способов сделать это. Вам нужен только один параметр в функции для получения списка ввода.

  1. Обновите значение в списке и верните список.

    q) f:{x[1]*:2;x}
    q) f 1 2 3
    q) 1 4 3 // output
    

Функция 'f' имеет параметр 'x', который будет присвоен списку ввода.

Использование функциональной поправки ('@')

q) f:{@[x;1;*;2]}
q) f 1 2 3
q) 1 4 3 //output
...