julia lang - 如何将多个函数应用于值

Phu*_*uoc 4 group-by function set dataframe julia

我想将一组函数应用于值并获取一组值作为输出.我在help?> groupby(DataFrames包)中看到我们可以做到:

> df |> groupby(:a) |> [sum, length]

> df |> groupby([:a, :b]) |> [sum, length]
Run Code Online (Sandbox Code Playgroud)

但我们能做到吗

> [sum, length](groupby([:a, :b]))
 MethodError: objects of type Array{Function,1} are not callable
 square brackets [] for indexing an Array.
 eval_user_input(::Any, ::Base.REPL.REPLBackend) at ./REPL.jl:64
    in macro expansion at ./REPL.jl:95 [inlined]
    in (::Base.REPL.##3#4{Base.REPL.REPLBackend})() at ./event.jl:68
Run Code Online (Sandbox Code Playgroud)

甚至

> [sum, length](1:5)
Run Code Online (Sandbox Code Playgroud)

我期待输出:

[15, 5]
Run Code Online (Sandbox Code Playgroud)

Tas*_*nou 6

是的,不是.(即是的,这是可能的,但不,不是那种语法):


否:您看到的语法|>和数据帧不是一般语法.这|>就是为数据帧定义方法的方法.在文件中看到它的定义grouping.jl(第377行),你会发现它只是另一个函数的包装器,它被定义为接受一个函数或一个函数向量.

PS:请注意,将|>参数"管道"到函数中的泛型只需要右侧的1参数函数,并且与此特定的"数据帧重载"方法几乎没有关系.


是: 您可以通过其他方式将一组功能应用于一组输入.
一种简单的方法,例如通过列表理解:

julia> a = [1 2 3;2 3 4];
julia> [f(a) for f in [sum, length, size]]
3-element Array{Any,1}:
 15     
  6     
   (2,3)
Run Code Online (Sandbox Code Playgroud)

或使用map:

julia> map( (x) -> x(a), [sum, length, size])
Run Code Online (Sandbox Code Playgroud)

等等


PS:如果你热衷于|>实现这一点,显然你也可以这样做:

julia> a |> (x) -> [sum(x), length(x), size(x)]
Run Code Online (Sandbox Code Playgroud)

但可能会失败你想要做的目的:)