gpt4 book ai didi

r - R 中从右到左的运算符结合性可能吗?

转载 作者:行者123 更新时间:2023-12-01 19:43:58 26 4
gpt4 key购买 nike

我是 R 新手,我刚刚发现我患有 Bracket Phobia (请参阅链接中的评论)。我喜欢 magrittr 表示法 %>% 的工作方式,因为它在某些情况下避免了嵌套括号,并使代码更具可读性。我来自 Mathematica,那里有一个非常相似的原生 // 表示法来完成 %>% 的功能。以下是 R 和 Mathematica 的一些比较:

#R Notation    
c(1.5,-2.3,3.4) %>% round %>% abs %>% sum

#Mathematica Notation
{1.5,-2.3,3.4}//Round//Abs//Total

到目前为止一切顺利,但是,我的问题是:

有没有办法模仿 Mathematica @ notation ,在 R 中具有从右到左的关联性?

以下是它在 Mathematica 中的工作原理,用于解决上面相同的代码:

Total@Abs@Round@{1.5,-2.3,3.4}

在 Mathematica 中也可以写成:

Total[Abs[Round[{1.5,-2.3,3.4}]]]

就像在R中一样:

sum(abs(round(c(1.5,-2.3,3.4))))

但是在 R 中使用这样的东西会更加干净(而且很酷):

sum@abs@round@c(1.5,-2.3,3.4)

PS:我知道@在S4类中使用,这不是一个好主意。这只是一个说明性比较。

最佳答案

我根本没有仔细测试/思考过这一点,但是通过运算符定义函数组合(如下所示)似乎在几个测试用例中都有效:

library(magrittr)

## operator defined as "left-pointing arrow" at the
## suggestion of @ClausWilke:
"%<%" <- function(x,y) { if (is(y,"function"))
function(z) x(y(z))
else x(y) }

x <- c(1.5,-2.3,3.4)
all.equal(x %>% round %>% abs %>% sum,
sum %<% abs %<% round %<% x)

x <- rnorm(1000)
all.equal(x %>% round %>% abs %>% sum,
sum %<% abs %<% round %<% x)

语法并不像能够使用单个字符(例如 @)作为组合运算符那么好,但即使您可以找到未使用的字符(所有明显的字符)[!@#$%^&*~|] 被采用,屏蔽它们将是一个糟糕的主意)有一个解析器限制:R 中用户定义的二元运算符必须采用 % 的形式?%

关于r - R 中从右到左的运算符结合性可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31305342/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com