在 Julia 中链接操作时显式指定参数
Explicitly specifying argument when chaining operations in Julia
使用 DataFramesMeta.jl
模块,可以使用以下方法在 Julia 中链接操作
using DataFrames, DataFramesMeta
df = DataFrame(a = collect(1:5), b = ["a","b","c","d","e"])
@> begin
df
@where(:a .> 2)
@select(:a, :b, c = :a*2)
end
# or:
print(
@linq df |>
@where(:a .> 2) |>
@select(:a,:b, c = :a*2)
)
3x3 DataFrames.DataFrame
| Row | a | b | c |
|-----|---|-----|----|
| 1 | 3 | "c" | 6 |
| 2 | 4 | "d" | 8 |
| 3 | 5 | "e" | 10 |
这个想法是 df
是宏 @where
的第一个参数,整个 @where
语句作为第一个参数提供给 @select
宏。
然而,我们可能希望顶行成为第二个参数,或者我们可能希望在多个地方使用它。对于 R 用户(在 R 中可以使用 %>%
链接操作),dplyr
包使用点 (.
) 符号启用此功能,因此以下内容有效:
library(dplyr)
df = data.frame(a = 1:5, b = c("a","b","c","d","e"))
df %>% filter(a > 2) %>% mutate(c = nrow(.):1) %>% select(b,c)
b c
1 c 3
2 d 2
3 e 1
我一直在寻找一种模仿 R 的点表示法的方法,但不幸的是,点表示法在 Julia 中不起作用,我在包文档中找不到任何相关信息。
如果有人知道如何实现,请告诉我们。
当 using Lazy
时,@as
宏允许您命名线程参数:
@as _ x f(_, y) g(z, _) == g(z, f(x, y))
使用 @as
宏,上述任务可以这样完成:
julia> import Lazy.@as
julia> using DataFrames, DataFramesMeta
julia> df = DataFrame(a = collect(1:5), b = ["a","b","c","d","e"])
5x2 DataFrames.DataFrame
| Row | a | b |
|-----|---|-----|
| 1 | 1 | "a" |
| 2 | 2 | "b" |
| 3 | 3 | "c" |
| 4 | 4 | "d" |
| 5 | 5 | "e" |
julia> @as _ df @where(_, :a .> 2) @select(_,:a, :b, c = :a*2)
3x3 DataFrames.DataFrame
| Row | a | b | c |
|-----|---|-----|----|
| 1 | 3 | "c" | 6 |
| 2 | 4 | "d" | 8 |
| 3 | 5 | "e" | 10 |
使用 DataFramesMeta.jl
模块,可以使用以下方法在 Julia 中链接操作
using DataFrames, DataFramesMeta
df = DataFrame(a = collect(1:5), b = ["a","b","c","d","e"])
@> begin
df
@where(:a .> 2)
@select(:a, :b, c = :a*2)
end
# or:
print(
@linq df |>
@where(:a .> 2) |>
@select(:a,:b, c = :a*2)
)
3x3 DataFrames.DataFrame
| Row | a | b | c |
|-----|---|-----|----|
| 1 | 3 | "c" | 6 |
| 2 | 4 | "d" | 8 |
| 3 | 5 | "e" | 10 |
这个想法是 df
是宏 @where
的第一个参数,整个 @where
语句作为第一个参数提供给 @select
宏。
然而,我们可能希望顶行成为第二个参数,或者我们可能希望在多个地方使用它。对于 R 用户(在 R 中可以使用 %>%
链接操作),dplyr
包使用点 (.
) 符号启用此功能,因此以下内容有效:
library(dplyr)
df = data.frame(a = 1:5, b = c("a","b","c","d","e"))
df %>% filter(a > 2) %>% mutate(c = nrow(.):1) %>% select(b,c)
b c
1 c 3
2 d 2
3 e 1
我一直在寻找一种模仿 R 的点表示法的方法,但不幸的是,点表示法在 Julia 中不起作用,我在包文档中找不到任何相关信息。
如果有人知道如何实现,请告诉我们。
当 using Lazy
时,@as
宏允许您命名线程参数:
@as _ x f(_, y) g(z, _) == g(z, f(x, y))
使用 @as
宏,上述任务可以这样完成:
julia> import Lazy.@as
julia> using DataFrames, DataFramesMeta
julia> df = DataFrame(a = collect(1:5), b = ["a","b","c","d","e"])
5x2 DataFrames.DataFrame
| Row | a | b |
|-----|---|-----|
| 1 | 1 | "a" |
| 2 | 2 | "b" |
| 3 | 3 | "c" |
| 4 | 4 | "d" |
| 5 | 5 | "e" |
julia> @as _ df @where(_, :a .> 2) @select(_,:a, :b, c = :a*2)
3x3 DataFrames.DataFrame
| Row | a | b | c |
|-----|---|-----|----|
| 1 | 3 | "c" | 6 |
| 2 | 4 | "d" | 8 |
| 3 | 5 | "e" | 10 |