让我们假设我们有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()函数的方法(因为我必须多次运行它,而且我想动态地更改函数调用的数量和参数)。目前,我不是应用函数或映射包的专家,但我想至少其中一个可以完成这项工作。
这当然只是一个虚拟的例子,我的实际代码要复杂得多,我只是尝试简化问题以找到解决方案。
我必须使用管道运算符,所以我只对也可用于管道的解决方案感兴趣。
答案 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
然后运行(如上使用func2
,func2_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_iterate
中2
的数量,减去T
乘以outcomes
中5
的数目。但我认为您实际上具有执行更复杂功能的功能。
答案 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