KDB + / Q:关于内部函数中未使用的参数

时间:2016-08-02 12:54:03

标签: kdb k

我有这个功能f

f:{{z+x*y}[x]/[y]}

我可以在没有第三个参数的情况下调用f,但我得到了,但内部{z+x*y}如何在没有第三个参数的情况下完成?

2 个答案:

答案 0 :(得分:6)

如果给一个带有两个参数的函数的单个列表,kdb将假定你想要第一个为x而余数为y(在over和scan的上下文中,通常不是)。例如:

#Our transformation function
scaleFUN <- function(x) sprintf("%.2f", x)

#Plot
library(ggplot2)
p <- ggplot(mpg, aes(displ, cty)) + geom_point()
p <- p + facet_grid(. ~ cyl)
p + scale_y_continuous(labels=scaleFUN)

也可以通过以下方式实现:

q){x+y}/[1;2 3 4]
10

这可能是你的例子中发生的事情。

编辑:

特别是,您可以使用此功能,如

q){x+y}/[1 2 3 4]
10

相当于(由于x的投影):

q){{z+x*y}[x]/[y]}[2;3 4 5 6]
56

相当于(由于我上面的原点):

q){y+2*x}/[3 4 5 6]
56

这解释了为什么不需要“第三”参数

答案 1 :(得分:4)

你需要了解两件事:&#39; over&#39;具有二元函数和投影的行为。

<强> 1。了解over / scan如何处理二元函数:  http://code.kx.com/q/ref/adverbs/#over

如果你有一个像(x1,x2,x3)这样的列表和功能&#39; f&#39;那么

f/(x1,x2,x3) ~  f[ f[x1;x2];x3]

因此,在每次迭代中,它都会从列表中获取一个元素,这将是&#39; y&#39;最后一次迭代的结果将是&#39; x&#39;。除了在第一次迭代中,第一个元素将是&#39; x&#39;第二个&#39;。

例如:

  q)   f:{x*y}   / call with -> f/ (4 5 6)

第一次迭代:x = 4,y = 5,结果= 20

第二次迭代:x = 20,y = 6,结果= 120

<强> 2。投影

让我们举一个带有3个参数的函数f3:

   q) f3:{[a;b;c] a+b+c}

现在我们可以通过修复(传递)一个参数

将其投影到f2
  q)  f2:f3[4]   / which means=> f2={[b;c] 4+b+c}

所以f2现在是二元的 - 它只接受2个参数。

所以现在来看你的例子,并应用上述两个概念,内部函数最终会因为投影而变成二元,然后最终会超过&#39;函数适用于这个新的二元函数。 我们可以将函数重写为:

f:{
f3:{z+x*y};
f2:f3[x];
f2/y
}