代码之家  ›  专栏  ›  技术社区  ›  IVR

在Julia中链接操作时显式指定参数

  •  3
  • IVR  · 技术社区  · 9 年前

    使用 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 以及整个 @其中 语句作为第一个参数馈送到 @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中不起作用,我在包文档中找不到关于这一点的任何信息。

    如果有人知道如何做到这一点,请告诉我们。

    1 回复  |  直到 9 年前
        1
  •  5
  •   Reza Afzalan    9 年前

    什么时候 using Lazy , @as 宏允许您命名线程参数:

    @as _ x f(_, y) g(z, _) == g(z, f(x, y))
    

    具有 @作为 宏,所提到的任务可以这样做:

    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 |