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)