地图,在朱莉娅用`|>`减少

时间:2015-04-08 21:02:53

标签: julia

在R中,dyplr使用%>%运算符,它允许您将函数的输出传递给新函数,从而无需存储中间值。在julia中,您可以使用|>运算符实现非常相似的功能。

使用示例

2 |> log |> sqrt 

对我而言,这比sqrt(log(2))好很多。特别是当链条变得很长时。我想使用这种语法,但也适用于Julia中的mapreduce - 类型函数。

设置

from = "abcdefghijklmnopqrstuvwxyz"
to   = "cdefghijklmnopqrstuvwxyzab"
trans = "g fmnc wms bgblr rpylqjyrc gr zw fylb <>"
d = {from[i] => to[i] for i = 1:26}
d[' '] = ' '

什么有效

map(x -> d[x], filter(x -> isalpha(x) || isspace(x), trans))

这样可行,但它读起来并不像我希望的那样好。另一种方法是将中间结果存储到变量中,但这似乎也很冗长:

res1 = filter(x -> isalpha(x) || isspace(x), trans)
map(x -> d[x], res1)

我更喜欢

R语法与此类似:

trans |> 
  filter(x -> isalpha(x) || isspace(x)) |> 
  map(x -> d[x])

这不起作用,因为在Julia中,映射/过滤器函数在迭代之前。 R会通过给你一个你可以使用的中缀.来解决这个问题,在这种情况下语法看起来会更像:

trans |> 
  filter(x -> isalpha(x) || isspace(x), .) |> 
  map(x -> d[x], .)

朱莉娅有可能这样吗? |>运算符有可能将长链代码清理成整齐的操作管道。也许更接近问题的Julia-thonic方式也可以被认为是这个问题的答案。

4 个答案:

答案 0 :(得分:11)

不完全确定您要找的是什么,但是:

SPOILER ALERT 8 - )

julia> trans |> 
         t -> filter(x -> isalpha(x) || isspace(x), t) |> 
         f -> map(x -> d[x],f)
"i hope you didnt translate it by hand "

答案 1 :(得分:7)

您还可以使用Lazy包中的@as宏来更接近您的首选表单:

julia> using Lazy

julia> @as _ trans begin
         filter(x -> isalpha(x) || isspace(x), _)
         map(x -> d[x], _)
       end
"i hope you didnt translate it by hand "

答案 2 :(得分:3)

你可以Pipe.jl包来这样做:

@pipe trans |> filter(x -> isalpha(x) || isspace(x), _) |> map(x -> d[x], _)

或者

@pipe ( trans 
     |> filter(x -> isalpha(x) || isspace(x), _) 
     |> map(x -> d[x], _)
)

如果宏转到多行,则需要围绕宏参数的括号。

注意:我是Pipe.jl的创建者和维护者

答案 3 :(得分:0)

与其他人略有不同,但我喜欢

using Lazy

from = "abcdefghijklmnopqrstuvwxyz"
to   = "cdefghijklmnopqrstuvwxyzab"
trans = "g fmnc wms bgblr rpylqjyrc gr zw fylb <>"

dd = Dict(zip(from, to))
@>> trans map(t -> isletter(t) ? dd[t] : t)

产生

"i hope you didnt translate it by hand <>"