gpt4 book ai didi

r - 如何在 R 中使用 %.% 运算符(编辑 : operator deprecated in 2014)

转载 作者:行者123 更新时间:2023-12-03 20:23:18 25 4
gpt4 key购买 nike

编辑:%.% 运算符现已弃用。使用 magrittr 中的 %>%。

原问题
这是什么%.%运营商呢??
我已经看到它与 dplyr 包一起使用了很多,但似乎找不到任何关于它是什么或它是如何工作的支持文档。

它似乎将命令链接在一起,但据我所知......当我在做的时候,谁能解释一下那些与 % 相关的特殊运算符的策略是什么?签署做什么,从技术上讲,什么时候是使用它们来更好地编码的合适时机?

最佳答案

我认为哈德利是向你解释的最佳人选,但我会试一试。
%.%是一个二元运算符,称为链运算符。在 R你几乎可以define any binary operator of your own带有特殊字符 % .从我看来,我们几乎用它来制作更简单的“可链接”语法(例如 x+y ,比 sum(x,y) 好得多)。你可以用它们做很酷的事情,see this cool example here.
%.%的目的是什么?在 dplyr ?让你更容易表达自己,减少你想做的事情和你表达方式之间的差距。

introduction to dplyr, 为例假设您想按年、月和日对航类进行分组,选择这些变量加上到达和离开的延误,按平均值汇总这些,然后仅过滤超过 30 的延误。如果没有 %.% ,你必须这样写:

filter(
summarise(
select(
group_by(hflights, Year, Month, DayofMonth),
Year:DayofMonth, ArrDelay, DepDelay
),
arr = mean(ArrDelay, na.rm = TRUE),
dep = mean(DepDelay, na.rm = TRUE)
),
arr > 30 | dep > 30
)

它可以完成工作。但是表达自己和阅读它是非常困难的。现在,您可以使用链运算符 %.% 以更友好的语法编写相同的内容。 :
hflights %.%
group_by(Year, Month, DayofMonth) %.%
select(Year:DayofMonth, ArrDelay, DepDelay) %.%
summarise(
arr = mean(ArrDelay, na.rm = TRUE),
dep = mean(DepDelay, na.rm = TRUE)
) %.%
filter(arr > 30 | dep > 30)

写和读都更容易!

这是如何运作的?

让我们来看看定义。先为 %.% :
function (x, y) 
{
chain_q(list(substitute(x), substitute(y)), env = parent.frame())
}

它使用另一个名为 chain_q 的函数.那么让我们来看看它:
function (calls, env = parent.frame()) 
{
if (length(calls) == 0)
return()
if (length(calls) == 1)
return(eval(calls[[1]], env))
e <- new.env(parent = env)
e$`__prev` <- eval(calls[[1]], env)
for (call in calls[-1]) {
new_call <- as.call(c(call[[1]], quote(`__prev`), as.list(call[-1])))
e$`__prev` <- eval(new_call, e)
}
e$`__prev`
}

那有什么作用?

为简化起见,假设您调用: group_by(hflights,Year, Month, DayofMonth) %.% select(Year:DayofMonth, ArrDelay, DepDelay) .

您的来电 xy那么两者都是 group_by(hflights,Year, Month, DayofMonth)select(Year:DayofMonth, ArrDelay, DepDelay) .因此该函数创建了一个名为 e 的新环境。 ( e <- new.env(parent = env) ) 并保存一个名为 __prev 的对象与第一个调用的评估( e$'__prev' <- eval(calls[[1]], env) 。然后对于每个其他调用,它会创建另一个调用,其第一个参数是前一个调用 - 即 __prev - 在我们的例子中它将是 select('__prev', Year:DayofMonth, ArrDelay, DepDelay) - 所以它“链接”循环内的调用。

由于您可以交替使用二元运算符,因此您实际上可以使用这种语法以一种非常易读的方式表达非常复杂的操作。

关于r - 如何在 R 中使用 %.% 运算符(编辑 : operator deprecated in 2014),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22314680/

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