带匿名函数的R流水线
我有一个问题,这是一个问题的延伸 我希望能够管道匿名函数。在上一个问题中,管道定义函数的答案是创建管道运算符“%|>%”,并按以下方式定义:带匿名函数的R流水线,r,pipeline,R,Pipeline,我有一个问题,这是一个问题的延伸 我希望能够管道匿名函数。在上一个问题中,管道定义函数的答案是创建管道运算符“%|>%”,并按以下方式定义: "%|>%" <- function(fun1, fun2){ function(x){fun2(fun1(x))} } 我希望能够使用以下匿名函数定义pipelineTest函数: square <- function(x){x^2} add5 <- function(x){x + 5} pipel
"%|>%" <- function(fun1, fun2){
function(x){fun2(fun1(x))}
}
我希望能够使用以下匿名函数定义pipelineTest
函数:
square <- function(x){x^2}
add5 <- function(x){x + 5}
pipelineTest <-
square %|>%
add5
anonymousPipelineTest <-
function(x){x^2} %|>%
function(x){x+5} %|>%
x
anonymousPipe <- Compose(
function(x){x^2},
function(x){x+5})
> anonymousPipe(1:10)
[1] 6 9 14 21 30 41 54 69 86 105
anonymousPipeData <- Compose(
seq(1:10),
function(x){x^2},
function(x){x+5})()
anonymousPipelineTest%
函数(x){x+5}%|>%
x
当我尝试使用与上面相同的参数调用此函数时,我得到以下结果:
> anonymousPipelineTest(1:10)
function(x){fun2(fun1(x))}
<environment: 0x000000000ba1c468>
匿名管道测试(1:10)
函数(x){fun2(fun1(x))}
我希望得到与管道测试(1:10)相同的结果。我知道这是一个微不足道的例子。我真正想了解的是一种管道匿名函数的方法。谢谢你的帮助 这是
?funprog
帮助页面上提供的示例的应用程序:
Funcall <- function(f, ...) f(...)
anonymousPipelineTest <- function(x) Reduce( Funcall, list(
function(x){x+5}, function(x){x^2}),
x, right=TRUE)
anonymousPipelineTest(1:10)
#[1] 6 9 14 21 30 41 54 69 86 105
Funcall这是?funprog
帮助页面上提供的示例的应用程序:
Funcall <- function(f, ...) f(...)
anonymousPipelineTest <- function(x) Reduce( Funcall, list(
function(x){x+5}, function(x){x^2}),
x, right=TRUE)
anonymousPipelineTest(1:10)
#[1] 6 9 14 21 30 41 54 69 86 105
Funcall使用Compose,调用生成的函数可以得到以下结果:
"%|>%" <- function(...) Compose(...)()
“%|>%%%函数(x){x}
匿名管道测试(1:10)
[1] 6 9 14 21 30 41 54 69 86 105
使用Compose并调用生成的函数可以得到以下结果:
"%|>%" <- function(...) Compose(...)()
“%|>%%%函数(x){x}
匿名管道测试(1:10)
[1] 6 9 14 21 30 41 54 69 86 105
我正在给出一个答案,这是我发现的最接近于其他寻找相同答案的人的答案。不过我不会给自己打分,因为这不是我想要的
返回函数:
如果你想把几个函数放在一起,我发现最简单的方法就是使用R的“Functional”包中的“Compose”函数。它看起来像这样:
square <- function(x){x^2}
add5 <- function(x){x + 5}
pipelineTest <-
square %|>%
add5
anonymousPipelineTest <-
function(x){x^2} %|>%
function(x){x+5} %|>%
x
anonymousPipe <- Compose(
function(x){x^2},
function(x){x+5})
> anonymousPipe(1:10)
[1] 6 9 14 21 30 41 54 69 86 105
anonymousPipeData <- Compose(
seq(1:10),
function(x){x^2},
function(x){x+5})()
返回数据:
如果您只想从一些数据开始并通过一系列转换发送它(我的初衷),那么“Compose”函数中的第一个函数应该是您的起始数据,在“Compose”函数结束后,添加一个括号对来调用该函数。看起来是这样的:
square <- function(x){x^2}
add5 <- function(x){x + 5}
pipelineTest <-
square %|>%
add5
anonymousPipelineTest <-
function(x){x^2} %|>%
function(x){x+5} %|>%
x
anonymousPipe <- Compose(
function(x){x^2},
function(x){x+5})
> anonymousPipe(1:10)
[1] 6 9 14 21 30 41 54 69 86 105
anonymousPipeData <- Compose(
seq(1:10),
function(x){x^2},
function(x){x+5})()
anonymousPipeData我给出了一个答案,这是我发现的最接近于其他寻找相同答案的人的答案。不过我不会给自己打分,因为这不是我想要的
返回函数:
如果你想把几个函数放在一起,我发现最简单的方法就是使用R的“Functional”包中的“Compose”函数。它看起来像这样:
square <- function(x){x^2}
add5 <- function(x){x + 5}
pipelineTest <-
square %|>%
add5
anonymousPipelineTest <-
function(x){x^2} %|>%
function(x){x+5} %|>%
x
anonymousPipe <- Compose(
function(x){x^2},
function(x){x+5})
> anonymousPipe(1:10)
[1] 6 9 14 21 30 41 54 69 86 105
anonymousPipeData <- Compose(
seq(1:10),
function(x){x^2},
function(x){x+5})()
返回数据:
如果您只想从一些数据开始并通过一系列转换发送它(我的初衷),那么“Compose”函数中的第一个函数应该是您的起始数据,在“Compose”函数结束后,添加一个括号对来调用该函数。看起来是这样的:
square <- function(x){x^2}
add5 <- function(x){x + 5}
pipelineTest <-
square %|>%
add5
anonymousPipelineTest <-
function(x){x^2} %|>%
function(x){x+5} %|>%
x
anonymousPipe <- Compose(
function(x){x^2},
function(x){x+5})
> anonymousPipe(1:10)
[1] 6 9 14 21 30 41 54 69 86 105
anonymousPipeData <- Compose(
seq(1:10),
function(x){x^2},
function(x){x+5})()
anonymousPipeData最后一个问题是一个有趣的练习,但实际上这不是做事的“R方式”。你不想用上一个问题中的方式做事有什么原因吗?我知道这不是“R方式”,如果这给人们带来了挫折,我很抱歉。我来自F#,它广泛使用管道操作符“|>”,对一组数据执行一系列函数。我发现这非常有用,而且在语法上非常清晰。再一次,我很抱歉,如果我问如何“把一个圆钉在一个方孔”。第一个问题来自于对R的无知,现在我在寻找R灵活性的极限。感谢所有帮助解决这个问题的人!最后一个问题是一个有趣的练习,但实际上这不是做事的“R方式”。你不想用上一个问题中的方式做事有什么原因吗?我知道这不是“R方式”,如果这给人们带来了挫折,我很抱歉。我来自F#,它广泛使用管道操作符“|>”,对一组数据执行一系列函数。我发现这非常有用,而且在语法上非常清晰。再一次,我很抱歉,如果我问如何“把一个圆钉在一个方孔”。第一个问题来自于对R的无知,现在我在寻找R灵活性的极限。感谢所有帮助解决这个问题的人!当然可以,但是你也可以很容易地使用编写对吗<代码>anonyPipeTest我(现在)看到Wallhood忽略了@mnel的答案,这基本上是我独立构建的。这个结果不同于OP。这个答案是以与OP相反的顺序应用函数(他平方,然后加5)。当然,但你也可以很容易地使用组合,不是吗<代码>anonyPipeTest我(现在)看到Wallhood忽略了@mnel的答案,这基本上是我独立构建的。这个结果不同于OP。这个答案是以与OP相反的顺序应用函数(他平方,然后加5)。太棒了!!非常感谢。很有魅力。太棒了!!非常感谢。工作起来很有魅力。