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

2

実際、それを行うための1つの方法を考えただけです。の部分文字列「%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 に答える