说我有一个数据集,我想使用管道语法对其应用几个过滤器,如下所示:

library(magrittr)
library(dplyr)
mtcars %<>%
  filter(cyl == 4) %>%
  select(cyl, mpg)
nrow(mtcars)
#[1] 11


在每个这样的步骤之后,我都使用nrow检查数据集的当前状态,因此我认为我可以沿以下代码行覆盖管道%<>%运算符

`%<?>%` <- function(lhs, rhs) {
  x <- magrittr::`%<>%`(lhs, rhs)
  if (is.data.frame(x) & pipeVerbose) print(nrow(x))
}
#Using this will generate errors like
#Error in pipes[[i]] : subscript out of bounds


现在,通过打开或关闭pipeVerbose标志,我将控制整个流程的跟踪过程。显然,由于内部评估机制的缘故,它并不是那么简单,如提示here所示。问题是,是否可以以最小的努力来实现所需的行为,即无需修补magittr内部构件?

我不得不承认整个想法有些令人不安,但是我的实际情况却有些复杂,我想通过一个简单的on / off开关隐藏一些调试/开发细节以用于演示。

最佳答案

由于链条利用了惰性评估,因此更好的翻译本来是这样的:

`%<?>%` <- function(lhs, rhs) {
  call <- match.call()
  call[[1]] <- quote(`%<>%`)
  x <- eval.parent(call)
  if (is.data.frame(x) & pipeVerbose) print(nrow(x))
}


我们基本上重写了函数调用并对其进行了评估。

10-07 19:25
查看更多