5

我最近一直在玩创建自己的管道,pipe_with()使用magittr. 我正在寻找跟踪当前链中的管道数量(因此我的管道可能会根据其在链中的位置而有所不同)。我以为我从magrittrgithub 页面得到了这个例子的答案:

# Create your own pipe with side-effects. In this example 
# we create a pipe with a "logging" function that traces
# the left-hand sides of a chain. First, the logger:
lhs_trace <- local({
  count <- 0
  function(x) {
    count <<- count + 1
    cl <- match.call()
    cat(sprintf("%d: lhs = %s\n", count, deparse(cl[[2]])))
  }
})

# Then attach it to a new pipe
`%L>%` <- pipe_with(lhs_trace)

# Try it out.
1:10 %L>% sin %L>% cos %L>% abs

1: lhs = 1:10
2: lhs = 1:10 %L>% sin
3: lhs = 1:10 %L>% sin %L>% cos
 [1] 0.6663667 0.6143003 0.9900591 0.7270351 0.5744009 0.9612168 0.7918362 0.5492263 0.9162743 0.8556344

左侧的数字是管道编号。但是,当我再次运行相同的链时,数字不会从 1 重新开始:

> 1:10 %L>% sin %L>% cos %L>% abs
4: lhs = 1:10
5: lhs = 1:10 %L>% sin
6: lhs = 1:10 %L>% sin %L>% cos
 [1] 0.6663667 0.6143003 0.9900591 0.7270351 0.5744009 0.9612168 0.7918362 0.5492263 0.9162743 0.8556344

这大概是因为在执行链中%L>%的最后一个时,第一次使用创建的本地环境没有被破坏。%L>%因此,为了知道管道在当前链中的位置(而不仅仅是从会话中的第一个管道开始),需要有一种方法在链结束时将计数变量设置回 0(或重置当地环境)。

有人对如何做到这一点有任何想法吗?

4

2 回答 2

4

在当前dev分支中,我们正在使用一种新方法,由于复合运算符 ,%<>%其中最后一个管道必须知道它是最后一个。无论如何,这意味着管道通过一个toplevelTRUE 或 FALSE 的本地值相对较快地了解这一点。我不知道这是否有任何用处。

特别是因为pipe_with收到的兴趣非常有限,因此被“搁置”。因此,它不是当前dev分支的一部分。

于 2014-06-26T06:29:43.207 回答
2

其实只是想了一个办法。只需计算子字符串“%L>”在 中的出现次数match.call

> lhs_trace2 <- function(x) {
+     cl <- match.call()
+     counter <- gregexpr("%L>%", cl[[2]], fixed = TRUE)[[1]]
+     if (counter[1] == -1) count <- 1 else count <- length(counter) + 1
+     cat(sprintf("%d: lhs = %s\n", count, deparse(cl[[2]])))
+   }
> 
> # Then attach it to a new pipe
> `%L>%` <- pipe_with(lhs_trace2)
> 
> # Try it out.
> 1:10 %L>% sin %L>% cos %L>% abs
1: lhs = 1:10
2: lhs = 1:10 %L>% sin
3: lhs = 1:10 %L>% sin %L>% cos
 [1] 0.6663667 0.6143003 0.9900591 0.7270351 0.5744009 0.9612168 0.7918362 0.5492263 0.9162743 0.8556344

然后再次运行它:

> 1:10 %L>% sin %L>% cos %L>% abs
1: lhs = 1:10
2: lhs = 1:10 %L>% sin
3: lhs = 1:10 %L>% sin %L>% cos
 [1] 0.6663667 0.6143003 0.9900591 0.7270351 0.5744009 0.9612168 0.7918362 0.5492263 0.9162743 0.8556344
于 2014-06-26T02:25:47.120 回答