0

我是德雷克的新手,但到目前为止我很喜欢它。我遇到的一件事是如何最好地尝试不同的管道配置。也就是说,我的计划纯粹由一系列目标组成,其中第一个目标的输出是第二个目标的输入,第二个形成第三个目标的输入,依此类推。我的目标都具有相同的基本结构(带有小标题的动态目标作为单个条目)预期作为输入并作为输出提供,并且我想尝试不同的顺序,包含/排除某些步骤等。例如:

plan = drake::drake_plan(

    a_transformed = target(
        compute_a_transform(list_of_input_data)
        , dynamic = map(list_of_input_data)
    )

    , b_transformed = target(
        compute_b_transform(a_transformed)
        , dynamic = map(a_transformed)
    )

    , c_transformed = target(
        compute_c_transform(c_transformed)
        , dynamic = map(c_transformed)
    )

)

到目前为止,我使用 drake 的方式是每个目标都有一个唯一/有意义的名称,因此,例如,当我删除一个目标时,我必须重命名提供给后续目标的输入:

plan = drake::drake_plan(

    a_transformed = target(
        compute_a_transform(list_of_input_data)
        , dynamic = map(list_of_input_data)
    )

    #, b_transformed = target(
    #    compute_b_transform(a_transformed)
    #    , dynamic = map(a_transformed)
    #)

    #note the b-transform step has been removed (commented-out), requiring inputs to c_transform to be changed from `b_transform` to `a_transform`

    , c_transformed = target(
        compute_c_transform(a_transformed) #had to rename things here
        , dynamic = map(a_transformed) #and here
    )

)

希望有一种更好的实验方法不需要手动注释和重命名是不是太过分了?

4

1 回答 1

0

我想出了一种方法,有点像黑客,但对我有用。我只是skip为每个触发输入返回的函数添加一个参数,如果TRUE

compute_a_transform = function(x,skip=F){
    if(skip){
        return(x)
    }
    ... #regular compute_a_transform stuff here
}

然后,当我想跳过处理链中的一个步骤时,我只需设置skip=TRUE而不注释掉或重命名任何内容

plan = drake::drake_plan(

    a_transformed = target(
        compute_a_transform(list_of_input_data)
        , dynamic = map(list_of_input_data)
    )

    , b_transformed = target(
        compute_b_transform(a_transformed, skip=TRUE) #skip=TRUE means the b-transform isn't actually applied
        , dynamic = map(a_transformed)
    )

    , c_transformed = target(
        compute_c_transform(c_transformed)
        , dynamic = map(c_transformed)
    )

)
于 2020-02-14T14:30:32.370 回答