vkolesnik
vkolesnik

Reputation: 379

Dplyr indirection / pipe doesn't work inside a closure

I have a code which uses dplyr indirection:

library(dplyr)

createGenerator <- function(data, column) 
{
    values <- data %>% pull({{column}})
    function(n)
    {
        values %>% sample(n)
    }
}

df <- data.frame(x = 1:10, y = 1:10)

df %>% createGenerator(x)(1)

It gives me an error

 Error in pull(., { : object 'x' not found 

However if I don't create a closure it works, like in code below

createGenerator <- function(data, column, n) 
{
    values <- data %>% pull({{column}}) %>% sample(n)
}

But I need a possibility to create a closure. What am I missing in closure creation code?

Upvotes: 2

Views: 140

Answers (1)

tjebo
tjebo

Reputation: 23747

There is a problem with the pipes, specifically the pipe within the enclosed function. I guess there might be a scoping problem, as you are dealing with different environments and also promises rather than existing objects.

No pipe (which I personally prefer, but I guess that's taste)

library(dplyr)

createGenerator <- function(data, column) {
  values <- pull(data, {{ column }})
  function(n) {
    sample(values, n)
  }
}

df <- data.frame(x = 1:10, y = 1:10)

createGenerator(df, x)(2)
#> [1] 4 5

or you create values within the enclosed function. Then the pipe works.

createGenerator <- function(data, column) {
  function(n) {
   values <- data %>% pull({{column}})
   values %>% sample(n)
  }
}

createGenerator(df, x)(2)
#> [1] 7 5

Upvotes: 1

Related Questions