马格里特2.0.3

马格里特2.0.2

马格里特2.0.1

马格里特2.0.0

快速和精益管道的实施

管道已在C中重写,目标如下注意:

作为重写的一部分,我们将管道的行为更改为使其更接近可能包含在R的未来版本。管道现在延迟计算管道表达式(#120). 此更改的主要后果是警告和错误现在可以通过尾随管道调用进行处理:

停止(“foo”)%>% 尝试()
警告(“酒吧”)%>% 禁止显示警告()

突破性变化

管道重写通常不会影响代码。我们有检查了2800个CRAN包装上的magrittr,发现只有十几个失败。magrittr的开发版本已在社交媒体试用期为3个月,无重大问题报道。然而,有些角落案例可能需要更新代码。以下是关于向后不兼容的报告如果您发现问题,我们在实际代码中找到了帮助您转换的方法在代码中。

行为返回()在管道中

在之前版本的magrittr中返回()管道内表达式未定义。应该吗从当前管道表达式返回,从整个管道返回,或从封闭函数?最有意义的行为是从封闭函数返回。然而,我们无法做到这一点使用新的实现很容易,因此调用返回()现在是一个错误。

我的函数(_F)<- 功能(x){
x个%>%{
    如果(.)返回(“正确”)
    “假”
}
}

我的函数(_F)(真的)
#>错误:没有可返回的函数,跳转到顶层

在magrittr 1.5中,返回()用于从返回当前管道表达式。您可以将其重写为等效值:

我的函数(_F)<- 功能(x){
x个%>%{
    如果(.) {
      “正确”
}其他的{
      “假”
}
}
}

我的函数(_F)(真的)
#>[1]“正确”

为了向后兼容性,我们有特殊大小写的尾随返回()调用,因为这在中很常见包装:

1 %>% 身份()%>% 返回()

但是请注意,这只从管道返回,而不是封闭函数(这是历史行为):

我的函数(_F)<- 功能() {
  “价值” %>% 身份()%>% 返回()
  “错误值”
}

我的函数(_F)()
#>[1]“错误值”

通常最好避免使用返回()在一个管道,即使是尾部。

懒惰导致的失败

使用新的惰性模型计算管道表达式,当最后一个管道表达式。只有当最后一个函数实际使用管道参数:

忽视<- 功能(x)“返回值”
停止(“从未打过电话”)%>% 忽视()
#>[1]“返回值”

这通常不会造成问题。然而我们发现了一些具有特殊行为的函数,在以下假设下编写管道的早期部分已经过评估,并且已经产生了副作用。这通常是不正确的行为,因为这意味着当使用调用时,这些函数无法正常工作嵌套形式,例如f(g(1))而不是1%>%g()%>%f().

解决此问题的方法是调用力()输入强制评估,然后检查副作用:

我的函数(_F)<- 功能(数据){
  (数据)
  查看侧面效果()
}

懒惰引起的另一个问题是,如果管道以不可见方式返回,而整个管道以不可视方式返回好。

1 %>% 身份()%>% 看不见的()
1 %>% 看不见的()%>% 身份()
1 %>% 身份()%>% 看不见的()%>% 身份()

这与等效的嵌套代码一致。这种行为可以通过两种方式解决。可以通过换行强制可见性括号中的管道:

我的函数(_F)<- 功能(x){
(x)%>% 看不见的()%>% 身份())
}

或者将结果分配给变量并返回:

我的函数(_F)<- 功能(x){
外面的<-x个%>% 看不见的()%>% 身份()
外面的
}

调用堆栈不正确内省

magrittr表达式不再在可以接受检查系统框架()系统父级().使用这些函数实现实际功能(与之相反作为调试工具)可能会产生错误。相反,你应该一般使用parent.frame()即使在R代码时也有效从不可见的框架中调用。这种情况发生在例如do.call()和新的C实现马格里特。

不正确关于magrittr内部构件的假设

一些软件包取决于magrittr的内部情况结构化的。稳健的代码应该只使用文档化和导出的API其他包的。

错误修复

马格里特1.5

新功能

功能顺序。

管道或“功能序列”不需要应用于左侧值立即。相反,它可以作为一种功能定义。最左侧为magrittr占位符(点.)从而创建一个函数,它按顺序将每个右侧应用于参数,例如f<-.%>%abs%>%平均值(na.rm=真).

新操作员

针对一些特殊情况引入了三个新的运算符

有关更多信息,请参阅文档,例如?%T> %.

兰姆达斯

现在可以通过用卷曲括起几个语句来生成Lambdas大括号,是dot参数的一元函数。

有关更多信息和示例,请参阅更新的小插曲和帮助文件夹。