0

功能应用方法有什么区别.[0!y;();xcols x],见于xkey

xkey
k){(#x)!.[0!y;();xcols x]}

和一个简单的函数调用:x xcols 0!y.

为什么函数 apply 在 中是首选xkey

第二个关于xcols从上下文内部调用的问题k)- 它是如何工作的?由于某种原因,我不能这样做:

t:([]a:`a`s`d;b:1 2 3;c:4 5 6)
k).[0!t;();xcols `a`b]
ERROR: 'xcols 
(attempt to use variable xcols without defining/assigning first (or user-defined signal))
4

1 回答 1

3

我认为功能应用可能适用于按名称传递表格时

t:([]a:`a`s`d;b:1 2 3;c:4 5 6)

.[0!t;();xcols[`a`b]]  /this works

`a`b xcols 0!t         /equivalent non functional form works

q)`a`b xcols 0!`t      /this fails when passing `t
'type
  [0]  `a`b xcols 0!`t


q).[0!`t;();xcols[`a`b]]  /though functional form still works with `t


q)`a`b xkey `t            /hence you can use xkey in place
`t

编辑:为了完整起见,为了在答案中包含我的评论,当在 k 中时,您应该在 q 命令前加上 .q 来访问它们,因为这是它们所在的命名空间

q)xcols[`a`b]
k){(x,f@&~(f:cols y)in x)#y}[`a`b]
q)\
  .q.xcols`a`b
k){(x,f@&~(f:cols y)in x)#y}[`a`b]

编辑 2:为了解决您的评论,您的示例的 xcols 归结为

`a`b`c#t

`a`b`c#`t 

不起作用。我没有太多解释为什么它不起作用,除了它是如何设计的。函数形式告诉 q 通过应用 take 函数来修改表。但是上面的示例不是将表重新定义为其列的重新排序的公认语法。

于 2020-09-04T10:10:27.330 回答