在R中,dyplr
使用%>%
运算符,它允许您将函数的输出传递给新函数,从而无需存储中间值。在julia中,您可以使用|>
运算符实现非常相似的功能。
2 |> log |> sqrt
对我而言,这比sqrt(log(2))
好很多。特别是当链条变得很长时。我想使用这种语法,但也适用于Julia中的map
,reduce
- 类型函数。
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方式也可以被认为是这个问题的答案。
答案 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 <>"