Michael, thanks for this info. I've stumbled upon this in a case where I walk an R expression (the AST) and (optionally) modifies it (part of the globals package). In R expressions, a function definition uses a pairlist to represent the arguments. For example,
> expr <- quote(function(x = 1) x) > str(as.list(expr)) List of 4 $ : symbol function $ :Dotted pair list of 1 ..$ x: num 1 $ : symbol x $ :Class 'srcref' atomic [1:8] 1 15 1 29 15 29 1 1 .. ..- attr(*, "srcfile")=Classes 'srcfilecopy', 'srcfile' <environment: 0x13918b8> Here the 2nd element is a pairlist: > str(expr[[2]]) Dotted pair list of 1 $ x: num 1 > typeof(expr[[2]]) [1] "pairlist" Now say that I want to update the default value of argument 'x', which is currently 1, to NULL. Then I do: > expr[[2]][1] <- list(x = NULL) At this step, I end up with an expression 'expr' where the arguments are no longer represented by a pairlist: > str(expr[[2]]) List of 1 $ x: NULL > typeof(expr[[2]]) [1] "list" More importantly, at this point 'expr' no longer holds a valid R expression: > expr Error: badly formed function expression The solution is to make sure we have a pairlist: > expr[[2]] <- as.pairlist(expr[[2]]) > expr function(x = NULL) x I agree it would be nice to fix this for consistency, but if you bump into major issues, at least I can live with having to use an explicit as.pairlist(). Thanks Henrik On Wed, Oct 12, 2016 at 10:53 AM, Michael Lawrence <lawrence.mich...@gene.com> wrote: > Hi Henrik, > > It would help to understand your use case for pairlists. > > Thanks, > Michael > > On Wed, Oct 12, 2016 at 9:40 AM, Michael Lawrence <micha...@gene.com> wrote: >> The coercion is probably the most viable workaround for now, as it's >> consistent with what happens internally for calls. All pairlists/calls >> are converted to list for subassignment, but only calls are converted >> back. My guess is that the intent was for users to move from using a >> pairlist to the "new" (almost 20 years ago) list. In my opinion, >> consistency trumps "convenience" in this case. If others agree, I'll >> change it to also coerce back to pairlist. >> >> Michael >> >> On Wed, Oct 12, 2016 at 9:20 AM, Henrik Bengtsson >> <henrik.bengts...@gmail.com> wrote: >>> Hi, I seem to not be able to assign NULL to an element of a pairlist >>> without causing it to be coerced to a plain list. For example: >>> >>>> x <- pairlist(1, 2) >>>> class(x) >>> [1] "pairlist" >>> >>>> x[1] <- list(NULL) >>>> class(x) >>> [1] "list" >>> >>> This actually true for all [()<- assignments regardless of list value, e.g. >>> >>>> x <- pairlist(1, 2) >>>> x[1] <- list(0) >>> [1] "list" >>> >>> I also tried assigning a pairlist(), but still the same problem: >>> >>>> x <- pairlist(1, 2) >>>> x[1] <- pairlist(0) >>> [1] "list" >>> >>> The only workaround I'm aware of is to: >>> >>> x <- as.pairlist(x) >>> >>> at the end. Any other suggestions? >>> >>> Thanks, >>> >>> Henrik >>> >>> ______________________________________________ >>> R-devel@r-project.org mailing list >>> https://stat.ethz.ch/mailman/listinfo/r-devel ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel