我想将一组函数应用于值并获取一组值作为输出。我在$ 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)
答案 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)