代码之家  ›  专栏  ›  技术社区  ›  cjm2671

如何通过KDB中的多个内部函数传递一个变量?

kdb
  •  0
  • cjm2671  · 技术社区  · 2 年前

    我有一个函数 peg :

      peg: {{$[abs[log x%y]>0.06;y;x]} scan x} 
    

    这个 0.06 是我想传递给的参数 从外面,这样我就可以做一些事情 0.06 peg x

    传递这个变量的干净方法是什么?

    3 回复  |  直到 2 年前
        1
  •  2
  •   terrylynch    2 年前

    您可以重写函数以添加显式变量,这样您就可以将局部变量名保持为 x y 。下面我添加了一个新的论点 v 用于要传递的值。

    peg: {[v;x]{[v;x;y]$[abs[log x%y]>v;y;x]}[v] scan x}
    
    peg[0.06;x]
    

    我认为没有其他简单的方法可以做到这一点。

        2
  •  1
  •   rianoc    2 年前

    只有内置的运算符和关键字才能使用中缀表示法:

    x func y
    

    用户定义的函数必须使用括号表示法

    func[x;y]
    

    可以使用投影传递参数。 kdb将自动检测隐式参数 [x;y;z]

    peg:{{$[abs[log y%z]>x;z;y]}[x] scan y}
    

    为了便于阅读,建议您选择自己的名字:

    peg:{[lim;lis] 
          {[lim;pre;cur] 
            $[abs[log pre%cur]>lim;cur;pre]}[lim] scan lis
         }
    
        3
  •  1
  •   terrylynch    2 年前

    通过向内部函数添加一个额外的变量来传递它,如Thomas所示,并将变量传递到内部函数中。

    回答你的第二部分 0.06 peg x …您实际上只能将这种“中缀”表示法用于内置函数,尽管您可以通过在q命名空间中定义函数来破解它

    q).q.peg:{{$[abs[log y%z]>x;z;y]}[x]scan y}
    q)0.6 peg 1 2 3 4
    1 2 2 4
    

    不建议使用.q命名空间,因此不值得麻烦

        4
  •  0
  •   nikeros    2 年前

    沿着相同的路线:

    peg:{{$[abs[log x%y]>z;y;x]}[;;y]\[x]}
    

    所以,如果你定义如下:

    v:(1;1.05;1.03;1.1;1;1.04)
    

    跑步 peg[v;0.06] 您将获得:

    1 1 1 1.1 1 1
    
    推荐文章