Function julia lang-如何对一个值应用多个函数

Function julia lang-如何对一个值应用多个函数,function,dataframe,group-by,set,julia,Function,Dataframe,Group By,Set,Julia,我想对一个值应用一组函数,并得到一组值作为输出。我看到在帮助?>groupby(数据帧包)中,我们可以做: > df |> groupby(:a) |> [sum, length] > df |> groupby([:a, :b]) |> [sum, length] 但我们能做到吗 > [sum, length](groupby([:a, :b])) MethodError: objects of type Array{Function,1} ar

我想对一个值应用一组函数,并得到一组值作为输出。我看到在
帮助?>groupby
(数据帧包)中,我们可以做:

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

> df |> groupby([:a, :b]) |> [sum, length]
但我们能做到吗

> [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
甚至

> [sum, length](1:5)
我希望产出:

[15, 5]

是和否。(也就是说,是的,这是可能的,但不是,不使用该语法):
否:您在
|>
和数据帧中看到的语法不是通用语法。这就是为数据帧定义
|>
方法的方式。在文件
grouping.jl
(第377行)中查看它的定义,您将看到它只是另一个函数的包装器,定义为接受函数或函数向量

PS:请注意,将参数“管道”到函数中的泛型
|>
,只在右侧使用单参数函数,与此特定的“dataframe重载”方法几乎没有关系


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

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)
或使用
映射

julia> map( (x) -> x(a), [sum, length, size])
等等


PS:如果您希望使用
来实现这一点,显然您也可以这样做:

julia> a |> (x) -> [sum(x), length(x), size(x)]
但这可能会破坏你想做的事情的目的:)

在Julia中,通过向类型
数组{T}
添加一个方法,可以使用您建议的语法(此处,
T
仅限于
函数的子类型
):


感谢您指出源代码。我可以扩展它来实现:
import Base.(|>)(|>){t1:5 |>collect |>[sum,length]2元素数组{Int64,1}:15
,这是一个很好的答案。我将进一步了解Julia的元编程,
julia> (a::Array{T}){T<:Function}(x) = [f(x) for f in a]

julia> [sin cos; exp sqrt](0)
2×2 Array{Float64,2}:
 0.0  1.0
 1.0  0.0
julia> @generated (t::NTuple{N, Function}){N}(x) = :($((:(t[$i](x)) for i in 1:N)...),)

julia> (cos, sin)(0)
(1.0,0.0)