Hadley Wickham
2021-Feb-15 21:10 UTC
[Rd] replicate evaluates its second argument in wrong environment
This is a nice example of the motivation for tidy evaluation ? since enquo() captures the environment in which the promise should be evaluated, there's no need for an additional explicit argument. library(rlang) replicate2 <- function (n, expr, simplify = "array") { exnr <- enquo(expr) sapply(integer(n), function(i) eval_tidy(expr), simplify = simplify) } doRep2 <- function(a, b) sapply(a, replicate2, b) doRep2(3, 2) #> [,1] #> [1,] 2 #> [2,] 2 #> [3,] 2 Hadley On Sat, Feb 13, 2021 at 7:09 AM Gabor Grothendieck <ggrothendieck at gmail.com> wrote:> > Currently replicate used within sapply within a function can fail > because it gets the environment for its second argument, which is > currently hard coded to be the parent frame, wrong. See this link for > a full example of how it goes wrong and how it could be made to work > if it were possible to pass an envir argument to it. > > https://stackoverflow.com/questions/66184446/sapplya-replicate-b-expression-no-longer-works-inside-a-function/66185079#66185079 > > -- > Statistics & Software Consulting > GKX Group, GKX Associates Inc. > tel: 1-877-GKX-GROUP > email: ggrothendieck at gmail.com > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel-- http://hadley.nz
David Winsemius
2021-Feb-15 23:05 UTC
[Rd] replicate evaluates its second argument in wrong environment
On 2/15/21 1:10 PM, Hadley Wickham wrote:> This is a nice example of the motivation for tidy evaluation ? since > enquo() captures the environment in which the promise should be > evaluated, there's no need for an additional explicit argument. > > library(rlang) > > replicate2 <- function (n, expr, simplify = "array") { > exnr <- enquo(expr)It does not appear that the line above would accomplish anything given the succeeding line. Or am I missing something? Taking it out doesn't seem to affect results. Whatever magic there is seems to be in the `eval_tidy` function, whose mechanism or rules seem opaque. Was "exnr" supposed to be passed to `eval_tidy`? -- David.> sapply(integer(n), function(i) eval_tidy(expr), simplify = simplify) > } > > doRep2 <- function(a, b) sapply(a, replicate2, b) > doRep2(3, 2) > #> [,1] > #> [1,] 2 > #> [2,] 2 > #> [3,] 2 > > Hadley > > On Sat, Feb 13, 2021 at 7:09 AM Gabor Grothendieck > <ggrothendieck at gmail.com> wrote: >> Currently replicate used within sapply within a function can fail >> because it gets the environment for its second argument, which is >> currently hard coded to be the parent frame, wrong. See this link for >> a full example of how it goes wrong and how it could be made to work >> if it were possible to pass an envir argument to it. >> >> https://stackoverflow.com/questions/66184446/sapplya-replicate-b-expression-no-longer-works-inside-a-function/66185079#66185079 >> >> -- >> Statistics & Software Consulting >> GKX Group, GKX Associates Inc. >> tel: 1-877-GKX-GROUP >> email: ggrothendieck at gmail.com >> >> ______________________________________________ >> R-devel at r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-devel > >