多次调用函数而不重复(%>%)

时间:2018-10-03 16:23:58

标签: r pipe apply purrr magrittr

让我们假设我们有3个功能,其中包含的功能最少:

library(magrittr)

func1(0) %>% func2(plus = T) %>% func2(plus = F) %>% func3
# result: 1

我想使用管道(%>%)运算符将这个函数彼此嵌套在一起:

func3(func2(func2(func1(0), plus = T), plus = F))
# result: 1

与之等效的版本:

 struct b
{
    virtual void f() {
        std::cout<<"\n Base f";
    };
};

struct d:b
{
     void f(){
        cout<<"\b Derived f";
    };
};

    //Driver code
    b *a =new d;
    void (b::*ptr)()=&b::f;
    (a->*ptr)(); 

我试图找到一种不需要重复func2()函数的方法(因为我必须多次运行它,而且我想动态地更改函数调用的数量和参数)。目前,我不是应用函数或映射包的专家,但我想至少其中一个可以完成这项工作。

这当然只是一个虚拟的例子,我的实际代码要复杂得多,我只是尝试简化问题以找到解决方案。

我必须使用管道运算符,所以我只对也可用于管道的解决方案感兴趣。

2 个答案:

答案 0 :(得分:2)

编写一个函数,该函数将初始String和结果输入到let jsonData = """ { "userId": 123, "id": 1, "title": "Title", "body": "Body", "postCode": "9999" } """.data(using: .utf8)! do { let postModel = try JSONDecoder().decode(PostModel.self, from: jsonData) if case .int(let int) = postModel.postCode { print(int) } else if case .string(let string) = postModel.postCode { print(string) // prints "9999" } } catch { print(error) } 并遍历这些结果:

x

然后运行(如上使用func2func2_iterate = function(x, outcomes){ for (i in 1:length(outcomes)){ x = func2(x, outcomes[i]) } return(x) } func1

func2

我还要指出,在这种特殊情况下,func3的输出只是其输入,再加上func1(0) %>% func2_iterate(c(T, F)) %>% func3 #result: 1 乘以func2_iterate2的数量,减去T乘以outcomes5的数目。但我认为您实际上具有执行更复杂功能的功能。

答案 1 :(得分:0)

使用partial / compose / invoke组合键:

library(tidyverse)
f2b <- invoke(compose, map(c(F,T), ~substitute(partial(func2, plus =.), lst(.))))

func1(0) %>% f2b %>% func3
# [1] 1