Разница в поведении функции при вызове автономной функции или внутри запроса в q

Я обнаружил странную проблему в q, вероятно, возможную ошибку. Я определил простую функцию, которая возвращает число с плавающей запятой, учитывая дату в качестве входных данных:

give_dummy:{[the_date] 
   /// give_dummy[2013.05.10]  // <- if u wanna test
   :$[ the_date > 2013.01.01 ; 0.001 ; 0.002] ;
 }

Он работает без проблем, если называется автономным:

q)give_dummy[2013.05.10]
0.001

Тем не менее, если я пытаюсь вызвать его в запросе, я получаю сообщение об ошибке:

q)select  give_dummy[date] from tab where sym = sec, i >= first_i  , i < 4000
'type

Если я упрощу функцию, чтобы просто вернуть дату ввода (функция идентификации), она будет работать в запросе. Если я упрощу функцию, чтобы просто вернуть число с плавающей запятой, без сравнения дат, она будет работать в запросе. Проблема возникает, когда я ИСПОЛЬЗУЮ дату ввода, чтобы сравнить ее в операторе if: $ [the_date> 2013.01.01; 0,001; 0,002]

То же самое происходит, если я переопределяю функцию, принимая в качестве входных данных число с плавающей запятой, а не дату, а затем я пытаюсь указать цену в качестве входных данных в запросе:

 give_dummy:{[the_price] 
    /// give_dummy[12]  // <- if u wanna test
   :$[ the_price > 20 ; 0.001 ; 0.002] ;
 }
 q) give_dummy[12]
 0.002
 q)select  give_dummy[price] from tab where sym = sec, i >= first_i  , i < 4000
 'type

Вы хоть представляете, почему это происходит? Все перепробовала. Спасибо Марко


person Marco Mene    schedule 29.05.2013    source источник
comment
Я добавляю, что если я попытаюсь вставить в запрос тривиальный оператор if, идентификатор не сработает: select ($ [1 ›0; 1; 0]), дата, цена, объем из вкладки, где sym = sec 'rank   -  person Marco Mene    schedule 29.05.2013
comment
Если я использую оператор? [;;] вместо оператора $ [;;]. Работает .. О_о   -  person Marco Mene    schedule 29.05.2013


Ответы (1)


Вам необходимо либо:

select give_dummy each date from tab where ...

Or:

give_dummy:{[the_date] :?[ the_date > 2013.01.01 ; 0.001 ; 0.002]; }
select give_dummy[date] from tab where ...

? - вектор условный. Подробнее см. Здесь: http://code.kx.com/q4m3/10_Execution_Control/

person mnestor    schedule 29.05.2013
comment
Спасибо! Я уже узнал об этом с помощью? оно работает. Итак, вывод состоит в том, что я должен рассматривать каждый столбец, выбранный в запросе, как вектор, когда я использую его в функции, а не функцию, действующую на отдельные записи .. Я буду иметь в виду - person Marco Mene; 29.05.2013
comment
Нет необходимости в :. Вы можете просто использовать функцию give_dummy:{[the_date] ?[the_date>2013.01.01;0.001;0.002]}, пока вы опускаете последний ;, который в противном случае подавляет вывод. В качестве примечания, столбцы не должны считаться векторами, они ЯВЛЯЮТСЯ векторами. Это ясно видно при определении таблицы ([] c1:abc; c2: 1 2 3) `c1 и c2 - оба простые векторы (один из символов, а другой из целых чисел). Усвоение этого сделает жизнь намного проще, а ваш код - более ясным. - person JPC; 14.08.2013