You could test for the version of R when using rapply. > getRversion() >= "3.2.0" [1] TRUE
I rarely use rapply(). I often find that writing my own purpose-built recursive function is easier than fitting my problem into rapply's framework. Bill Dunlap TIBCO Software wdunlap tibco.com On Wed, Jul 15, 2015 at 1:46 PM, Dayne Filer <dayne.fi...@gmail.com> wrote: > Bill, > > Is your conclusion to just update the code and enforce using the most > recent version of R? > > Dayne > > On Wed, Jul 15, 2015 at 4:44 PM, Dayne Filer <dayne.fi...@gmail.com> > wrote: > >> David, >> >> If you are referring to the solution that would be: >> >> rapply(list(test), eval, envir = fenv) >> >> I thought I explained in the question that the above code does not work. >> It does not throw an error, but the behavior is no different (at least in >> the output or result). Using the above code still results in the x object >> not being stored in fenv on 3.1.2. >> >> Dayne >> >> On Wed, Jul 15, 2015 at 4:40 PM, William Dunlap <wdun...@tibco.com> >> wrote: >> >>> Another aspect of the change is (using TERR's RinR package): >>> > options(REvaluators=list(makeREvaluator("R-3.1.3"), >>> makeREvaluator("R-3.2.0"))) >>> > RCompare(rapply(list(quote(function(x)x),list(quote(pi),quote(7-4))), >>> function(arg)typeof(arg))) >>> R version 3.1.3 (2015-03-09) R version 3.2.0 (2015-04-16) >>> [1,] [1] "closure" "double" [1] "language" "symbol" >>> [2,] [3] "double" [3] "language" >>> $all.equal >>> $all.equal$`R version 3.1.3 (2015-03-09) vs. R version 3.2.0 >>> (2015-04-16)` >>> [1] "3 string mismatches" >>> >>> I prefer the new semantics, but it is a change. >>> >>> >>> >>> Bill Dunlap >>> TIBCO Software >>> wdunlap tibco.com >>> >>> On Wed, Jul 15, 2015 at 1:25 PM, David Winsemius <dwinsem...@comcast.net >>> > wrote: >>> >>>> >>>> On Jul 15, 2015, at 12:51 PM, William Dunlap wrote: >>>> >>>> > I think rapply() was changed to act like lapply() in this respect. >>>> > >>>> >>>> When I looked at the source of the difference, it was that typeof() >>>> returned 'language' in 3.2.1, while it returned 'list' in the earlier >>>> version of R. The first check in rapply's code in both version was: >>>> >>>> if (typeof(object) != "list") >>>> stop("'object' must be a list") >>>> >>>> Wrapping list() around the first argument and switching to using eval >>>> with an expression-object rather than a call-object seemed to solve the >>>> problem when this was posed as a question on StackOverflow, but Dayne was >>>> not happy with that solution for other reasons that he is not describing. >>>> >>>> -- >>>> David. >>>> >>>> > In R-3.1.3 we got >>>> > rapply(list(quote(1+myNumber)), evalq, >>>> envir=list2env(list(myNumber=17))) >>>> > #[1] 18 >>>> > rapply(list(quote(1+myNumber)), eval, >>>> envir=list2env(list(myNumber=17))) >>>> > #Error in (function (expr, envir = parent.frame(), enclos = if >>>> > (is.list(envir) || : >>>> > object 'myNumber' not found >>>> > lapply(list(quote(1+myNumber)), evalq, >>>> envir=list2env(list(myNumber=17))) >>>> > #Error in eval(substitute(expr), envir, enclos) : object 'X' not found >>>> > lapply(list(quote(1+myNumber)), eval, >>>> envir=list2env(list(myNumber=17))) >>>> > #[[1]] >>>> > #[1] 18 >>>> > while in R-3.2.0 we get >>>> > rapply(list(quote(1+myNumber)), evalq, >>>> envir=list2env(list(myNumber=17))) >>>> > #Error in eval(substitute(expr), envir, enclos) : object 'X' not found >>>> > rapply(list(quote(1+myNumber)), eval, >>>> envir=list2env(list(myNumber=17))) >>>> > #[1] 18 >>>> > lapply(list(quote(1+myNumber)), evalq, >>>> envir=list2env(list(myNumber=17))) >>>> > #Error in eval(substitute(expr), envir, enclos) : object 'X' not found >>>> > lapply(list(quote(1+myNumber)), eval, >>>> envir=list2env(list(myNumber=17))) >>>> > #[[1]] >>>> > #[1] 18 >>>> > >>>> > Make the FUN argument function(arg)sys.call() to see some details of >>>> the >>>> > change. >>>> > >>>> > >>>> > Bill Dunlap >>>> > TIBCO Software >>>> > wdunlap tibco.com >>>> > >>>> > On Wed, Jul 15, 2015 at 12:35 PM, Dayne Filer <dayne.fi...@gmail.com> >>>> wrote: >>>> > >>>> >> In 3.1.2 eval does not store the result of the bquote-generated call >>>> in >>>> >> the given environment. Interestingly, in 3.2.1 eval does store the >>>> result >>>> >> of the bquote-generated call in the given environment. >>>> >> >>>> >> In other words if I run the given example with eval rather than >>>> evalq, on >>>> >> 3.1.2 "x" is never stored in "fenv," but it is when I run the same >>>> code on >>>> >> 3.2.1. However, the given example stores "x" in "fenv" on 3.1.2, but >>>> throws >>>> >> the error I gave when run on 3.2.1. >>>> >> >>>> >> To give credit, I received the idea for using evalq from SO: >>>> >> http://stackoverflow.com/a/22559385 >>>> >> >>>> >> Dayne >>>> >> >>>> >> >>>> >> On Wed, Jul 15, 2015 at 3:29 PM, William Dunlap <wdun...@tibco.com> >>>> wrote: >>>> >> >>>> >>> I am curious why you used evalq instead of eval in this code. >>>> >>> >>>> >>> Bill Dunlap >>>> >>> TIBCO Software >>>> >>> wdunlap tibco.com >>>> >>> >>>> >>> On Wed, Jul 15, 2015 at 11:49 AM, Dayne Filer < >>>> dayne.fi...@gmail.com> >>>> >>> wrote: >>>> >>> >>>> >>>> Hello, >>>> >>>> >>>> >>>> I upgraded from 3.1.2 to 3.2.1 and am receiving errors on code that >>>> >>>> worked >>>> >>>> as I intended previously. Briefly, I am using bquote to generate >>>> >>>> expressions to modify data.table objects within a function, so I >>>> need >>>> >>>> the >>>> >>>> changes to actually be stored in the given environment. >>>> Previously, I >>>> >>>> used >>>> >>>> code like the following: >>>> >>>> >>>> >>>> test <- list(bquote(x <- 10)) >>>> >>>> fenv <- environment() >>>> >>>> rapply(test, evalq, envir = fenv) >>>> >>>> >>>> >>>> Although the code in the example above is much simpler, it shows >>>> the >>>> >>>> problem. On 3.1.2 the expression is evaluated and x is stored as >>>> 10 in >>>> >>>> the >>>> >>>> given environment, fenv. In 3.2.1 the code throws an error: >>>> >>>> >>>> >>>> Error in eval(substitute(expr), envir, enclos) : object 'X' not >>>> found >>>> >>>> >>>> >>>> I could not find anything in the release notes that would explain >>>> this >>>> >>>> change. Changing evalq to eval works in 3.2.1, but eval does not >>>> store x >>>> >>>> in >>>> >>>> the given environment in 3.1.2. >>>> >>>> >>>> >>>> Thanks, >>>> >>>> >>>> >>>> Dayne >>>> >>>> >>>> >>>> [[alternative HTML version deleted]] >>>> >>>> >>>> >>>> ______________________________________________ >>>> >>>> R-devel@r-project.org mailing list >>>> >>>> https://stat.ethz.ch/mailman/listinfo/r-devel >>>> >>>> >>>> >>> >>>> >>> >>>> >> >>>> > >>>> > [[alternative HTML version deleted]] >>>> > >>>> > ______________________________________________ >>>> > R-devel@r-project.org mailing list >>>> > https://stat.ethz.ch/mailman/listinfo/r-devel >>>> >>>> David Winsemius >>>> Alameda, CA, USA >>>> >>>> >>> >> > [[alternative HTML version deleted]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel