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

时间:2016-11-09 00:07:40

标签: function dataframe group-by set julia

我想将一组函数应用于值并获取一组值作为输出。我在$ http :8081/jsonp HTTP/1.1 200 OK Content-Encoding: gzip Content-Length: 39 Content-Type: application/json { "foo": "bar" } $ http :8080/jsonp?callback=myfunction HTTP/1.1 200 OK Content-Encoding: gzip Content-Length: 56 Content-Type: application/javascript /**/myfunction({"foo":"bar"}); (DataFrames包)中看到了我们可以做到的事情:

help?> 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)

2 个答案:

答案 0 :(得分:6)

是和否。(即是的,可能,但不,不是那种语法):

<小时/> 否:您在|>和数据框中看到的语法不是一般语法。它是如何为数据框定义|>方法的。在文件grouping.jl(第377行)中查看其定义,您将看到它只是另一个函数的包装器,并且它被定义为接受函数或向量功能。

PS:注意通用|>&#34; pipe&#34;一个函数的参数,只需要右侧的1参数函数,并且与这个特殊的&#34; dataframe-overloaded&#34;方法

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

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)

或使用map

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

<小时/> PS:如果您热衷于使用|>来实现这一目标,显然您也可以这样做:

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

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

答案 1 :(得分:1)

通过向Array{T}类型添加方法,可以在Julia中使用您提出的语法(此处,T仅限于Function的子类型):

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

但是,如果函数的数量很少,这会产生很大的开销。为了获得最大速度,可以使用Tuple@generated函数手动展开循环:

julia> @generated (t::NTuple{N, Function}){N}(x) = :($((:(t[$i](x)) for i in 1:N)...),)

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